В приведенном ниже коде Mockito verify не работает должным образом для методов scala с параметром по умолчанию, но отлично работает с методами без параметров по умолчанию.
package verifyMethods
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.mockito.Mockito.times
import org.scalatest.FlatSpec
import org.scalatest.Matchers.be
import org.scalatest.Matchers.convertToAnyShouldWrapper
import org.scalatest.junit.JUnitRunner
import org.scalatest.mock.MockitoSugar
trait SUT {
def someMethod( bool: Boolean ): Int = if ( bool ) 4 else 5
def someMethodWithDefaultParameter( bool: Boolean, i: Int = 5 ): Int = if ( bool ) 4 else i
}
@RunWith( classOf[JUnitRunner] )
class VerifyMethodWithDefaultParameter extends FlatSpec with MockitoSugar with SUT {
"mockito verify method" should "pass" in {
val sutMock = mock[SUT]
Mockito.when( sutMock.someMethod( true ) ).thenReturn( 4, 6 )
val result1 = sutMock.someMethod( true )
result1 should be( 4 )
val result2 = sutMock.someMethod( true )
result2 should be( 6 )
Mockito.verify( sutMock, times( 2 ) ).someMethod( true )
}
//this test fails with assertion error
"mockito verify method with default parameter" should "pass" in {
val sutMock = mock[SUT]
Mockito.when( sutMock.someMethodWithDefaultParameter( true ) ).thenReturn( 4, 6 )
val result1 = sutMock.someMethodWithDefaultParameter( true )
result1 should be( 4 )
val result2 = sutMock.someMethodWithDefaultParameter( true )
result2 should be( 6 )
Mockito.verify( sutMock, times( 2 ) ).someMethodWithDefaultParameter( true )
}
}
Пожалуйста, подскажите, что я делаю не так во втором тесте.
Изменить 1: @Som. Найдите трассировку стека для вышеуказанного тестового класса ниже: -
Run starting. Expected test count is: 2
VerifyMethodWithDefaultParameter:
mockito verify method
- should pass
mockito verify method with default parameter
- should pass *** FAILED ***
org.mockito.exceptions.verification.TooManyActualInvocations: sUT.someMethodWithDefaultParameter$default$2();
Wanted 2 times:
-> at zeither.VerifyMethodWithDefaultParameter$$anonfun$2.apply$mcV$sp(VerifyMethodWithDefaultParameter.scala:37)
But was 3 times. Undesired invocation:
-> at zeither.VerifyMethodWithDefaultParameter$$anonfun$2.apply$mcV$sp(VerifyMethodWithDefaultParameter.scala:34)
...
Run completed in 414 milliseconds.
Total number of tests run: 2
Suites: completed 1, aborted 0
Tests: succeeded 1, failed 1, canceled 0, ignored 0, pending 0
*** 1 TEST FAILED ***
Изменить 2: @Mifeet
Как было предложено, если я передаю 0 для параметра int по умолчанию, тест проходит, но ниже тестовый пример не проходит с предложенным aprroach: -
"mockito verify method with default parameter" should "pass" in {
val sutMock = mock[SUT]
Mockito.when( sutMock.someMethodWithDefaultParameter( true, 0 ) ).thenReturn( 14 )
Mockito.when( sutMock.someMethodWithDefaultParameter( false, 0 ) ).thenReturn( 16 )
val result1 = sutMock.someMethodWithDefaultParameter( true )
result1 should be( 14 )
val result2 = sutMock.someMethodWithDefaultParameter( false )
result2 should be( 16 )
Mockito.verify( sutMock, times( 1 ) ).someMethodWithDefaultParameter( true )
Mockito.verify( sutMock, times( 1 ) ).someMethodWithDefaultParameter( false )
}
Пожалуйста, найдите ниже stacktrace: -
mockito verify method with default parameter
- should pass *** FAILED ***
org.mockito.exceptions.verification.TooManyActualInvocations: sUT.someMethodWithDefaultParameter$default$2();
Wanted 1 time:
-> at zeither.VerifyMethodWithDefaultParameter$$anonfun$2.apply$mcV$sp(VerifyMethodWithDefaultParameter.scala:38)
But was 2 times. Undesired invocation:
-> at zeither.VerifyMethodWithDefaultParameter$$anonfun$2.apply$mcV$sp(VerifyMethodWithDefaultParameter.scala:35)
...
Мы высоко ценим ваше мнение о других существующих имитационных библиотеках, таких как PowerMock, ScalaMock, если они могут предоставить изящное решение для таких случаев, поскольку я открыт для использования любой имитирующей библиотеки в своем проекте.