Ich habe darüber gegoogelt, aber nichts Relevantes gefunden. Ich habe so etwas:
Object obj = getObject();
Mockeable mock= Mockito.mock(Mockeable.class);
Mockito.when(mock.mymethod(obj )).thenReturn(null);
Testeable testableObj = new Testeable();
testableObj.setMockeable(mock);
command.runtestmethod();
Jetzt möchte ich überprüfen, ob das mymethod(Object o)
, was im Inneren runtestmethod()
aufgerufen wird, mit dem Objekt aufgerufen wurde o
, nicht mit einem anderen. Aber ich bestehe den Test immer, was auch immer ich auf die Verifizierung stelle, zum Beispiel mit:
Mockito.verify(mock.mymethod(Mockito.eq(obj)));
oder
Mockito.verify(mock.mymethod(Mockito.eq(null)));
oder
Mockito.verify(mock.mymethod(Mockito.eq("something_else")));
Ich habe den Test immer bestanden. Wie kann ich diese Überprüfung durchführen (wenn möglich)?
Danke dir.
java
unit-testing
junit
mockito
Manolowar
quelle
quelle
Versuchen Sie, mit der .equals-Methode des Objekts eine logische Gleichheit herzustellen? Sie können dies mit dem in Mockito enthaltenen argThat-Matcher tun
Als Nächstes können Sie Ihren eigenen Argument-Matcher implementieren, der die Methode .equals für jedes Objekt zurückstellt
Mit Ihrem Code können Sie ihn jetzt aktualisieren, um ...
Wenn Sie nur GENAUE Gleichheit anstreben (dasselbe Objekt im Speicher), tun Sie dies einfach
Dadurch wird überprüft, ob es einmal aufgerufen wurde.
quelle
ReflectionEquals
Klasse für diese Zwecke verwenden.verify(mock).mymethod(obj);
nicht auf GENAUE Gleichheit geprüft wird (dasselbe Objekt im Speicher). Stattdessen wird die Methode equals-equals verwendet, die möglicherweise überschrieben wurde.ArgumentMatcher
, um weniger ausführlich zu sein.verify()
dieequals()
Methode / des eingehenden Arguments anstelle der Methode / des aufgezeichneten Objektsequals()
aufgerufen. Dies ist irrelevant, es sei denn, Sie versuchen zu bestätigen, dass Ihr Testobjekt eine bestimmte Objektinstanz zurückgibt, und das Subjekt gibt stattdessen einen transparenten Dekorator dieser Instanz zurück. Dieverify
Argumenteequals()
würden den Dekorateur nicht kennen; während der Dekorateurequals()
umgeschrieben würde, um das Original zu tolerieren. In diesem Fall schlägt Ihr Test fälschlicherweise fehl.eq
Matcher nicht, wenn Sie keine anderen Matcher verwenden..verify(mock)
. Sie initiieren jetzt die Überprüfung des Ergebnisses des Methodenaufrufs, ohne etwas zu überprüfen (ohne einen Methodenaufruf durchzuführen). Daher bestehen alle Tests.Ihr Code sollte folgendermaßen aussehen:
quelle
argThat
plus LambdaSo können Sie Ihre Argumentprüfung nicht bestehen:
wo
argThat
plus behauptetder obige Test wird "sagen"
Expected: lambda$... Was: YourClass.toSting...
. Sie können eine spezifischere Ursache für den Fehler ermitteln, wenn Sie Asserts im Lambda verwenden:ABER: DAS FUNKTIONIERT NUR MIT 1 METHODENRUF. Wenn die verifizierte Methode mehr als 2 Mal aufgerufen wird, übergibt mockito alle aufgerufenen Kombinationen an jeden Verifizierer. Mockito erwartet daher, dass Ihr Verifizierer stillschweigend
true
für eines der eingestellten Argumente undfalse
(keine Assert-Ausnahmen) für andere gültige Aufrufe zurückgibt . Diese Erwartung ist für 1 Methodenaufruf kein Problem - sie sollte nur 1 Mal true zurückgeben.Jetzt sagt der Test :
Expected: Obj.description to contain 'KEY'. Was: 'Actual description'
. HINWEIS: Ich habeassertJ
Asserts verwendet, aber es liegt an Ihnen, welches Assertion-Framework verwendet werden soll.argThat
mit mehreren Argumenten.Wenn Sie verwenden
argThat
, müssen alle Argumente mit Übereinstimmungen versehen sein. Z.B:wo:
eq
MatcherDer einfachste Weg, um zu überprüfen, ob das Argument gleich ist:
direktes Argument
Wenn ein Vergleich mit ref akzeptabel ist, fahren Sie fort mit:
Die Wurzelursache für das Versagen der ursprünglichen Frage war die falsche Stelle der Klammern :
verify(mock.mymethod...
. Das war falsch. Das Recht wäre:verify(mock).*
quelle
Ich habe Mockito.verify auf diese Weise verwendet
quelle
Haben Sie die Methode equals für die verspottbare Klasse überprüft? Wenn dieser immer true zurückgibt oder Sie dieselbe Instanz gegen dieselbe Instanz testen und die Methode same nicht überschrieben wird (und daher nur anhand der Referenzen überprüft wird), wird true zurückgegeben.
quelle
Die andere Methode besteht darin, die Methode org.mockito.internal.matchers.Equals.Equals zu verwenden, anstatt eine neu zu definieren:
quelle
Haben Sie es mit demselben () Matcher versucht? Wie in:
Ich hatte das gleiche Problem. Ich habe es sowohl mit dem eq () Matcher als auch mit dem refEq () Matcher versucht, aber ich hatte immer falsch positive Ergebnisse. Wenn ich denselben () Matcher verwendet habe, ist der Test fehlgeschlagen, wenn die Argumente unterschiedliche Instanzen waren, und wurde bestanden, sobald die Argumente dieselbe Instanz waren.
quelle
Sie können auch TypeSafeDiagnosingMatcher verwenden
Überprüfen Sie dann diesen Aufruf:
quelle