In unten Code funktioniert Mockito Verify nicht wie erwartet auf Scala-Methoden mit Standardparameter, aber funktioniert gut bei Methoden ohne Standardparameter.Mockito Verify schlägt mit "TooManyActualInvocations" für Methode mit einem Standardparameter in Scala fehl
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)
}
}
Bitte schlagen Sie vor, was ich im zweiten Test falsch mache.
Edit 1: @Som Hier finden Sie Stacktrace für oben Test-Klasse: -
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 ***
Edit 2: @Mifeet
Wie bereits angedeutet, wenn Ich übergebe 0 für Standard-int-Parametertest-Pässe, aber unter Testfall wird nicht mit dem vorgeschlagenen Aprr übergeben oach: -
"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)
}
Hier finden Sie 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)
...
Ihre Meinung zu anderen bestehenden spöttischen Bibliotheken wie PowerMock, ScalaMock wird sehr geschätzt, wenn sie eine saubere Lösung für solche Fälle zur Verfügung stellen kann, wie Ich bin offen, jede spöttische Bibliothek in meinem Projekt zu verwenden.
Bitte klar, was Sie „erwarten“ und was Sie sehen. –
Siehe meine aktualisierte Antwort. Manchmal müssen Sie sich nur die Hände schmutzig machen, bevor Sie sich in Biegerahmen für etwas ertränken, für das sie nicht bestimmt waren. – Mifeet