Ich habe einen Methodenaufruf, den ich mit mockito verspotten möchte. Zunächst habe ich eine Instanz eines Objekts erstellt und eingefügt, für das die Methode aufgerufen wird. Mein Ziel ist es, eines der Objekte im Methodenaufruf zu überprüfen.
Gibt es eine Möglichkeit, mit mockito das Objekt und seine Attribute beim Aufruf der mock-Methode zu bestätigen oder zu überprüfen?
Beispiel
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>anyObject())
Anstatt dies zu tun, anyObject()
möchte ich überprüfen, ob das Argumentobjekt einige bestimmte Felder enthält
Mockito.verify(mockedObject)
.someMethodOnMockedObject(
Mockito.<SomeObjectAsArgument>**compareWithThisObject()**)
Antworten:
Die neue Funktion von Mockito macht dies noch einfacher.
Schauen Sie sich die Mockito- Dokumentation an
Wenn mehr als ein Parameter vorhanden ist und nur ein einziger Parameter erfasst werden soll, verwenden Sie andere ArgumentMatcher, um die restlichen Argumente zu verpacken:
quelle
Ich denke, der einfachste Weg, ein Argumentobjekt zu überprüfen, ist die Verwendung der folgenden
refEq
Methode:Es kann auch verwendet werden, wenn das Objekt nicht implementiert wird
equals()
, da Reflexion verwendet wird. Wenn Sie einige Felder nicht vergleichen möchten, fügen Sie einfach ihre Namen als Argumente für hinzurefEq
.quelle
Eine weitere Möglichkeit, wenn Sie nicht verwenden möchten
ArgumentCaptor
(z. B. weil Sie auch Stubbing verwenden), ist die Verwendung von Hamcrest Matchers in Kombination mit Mockito.quelle
Matchers
Paket korrekt ist, da das Schreiben derselben Codezeile mit derorg.mockito.Matchers
Klasse eine irreführende Ausnahme auslöst, die besagt, dass der Parameter der Scheinfunktion einfach nicht übereinstimmt.MockitoHamcrest.argThat()
und nichtMockito.argThat()
Dies ist eine Antwort, die auf der Antwort von iraSenthil basiert, jedoch mit Anmerkungen ( Captor ). Meiner Meinung nach hat es einige Vorteile:
Beispiel:
quelle
captor.getAllValues()
. Diecaptor.getValue()
in der Antwort verwendete Methode liefert das letzte Ergebnis.Wenn Sie Java 8 verwenden, können Sie passende Lambda-Ausdrücke verwenden.
Beispielaufruf
Weitere Informationen: http://source.coveo.com/2014/10/01/java8-mockito/
quelle
Die obigen Lösungen haben in meinem Fall nicht wirklich funktioniert. Ich konnte ArgumentCaptor nicht verwenden, da die Methode mehrmals aufgerufen wurde und ich jede überprüfen musste. Ein einfacher Matcher mit "argThat" hat den Trick leicht gemacht.
Benutzerdefinierter Matcher
Test Runner
quelle
Und sehr schöne und saubere Lösung in koltin aus
com.nhaarman.mockito_kotlin
quelle
Sie können Folgendes verweisen:
Dadurch wird überprüft, ob die Methode mockedObject mit dem gewünschten Objekt als Parameter aufgerufen wird.
quelle
Ein weiterer einfacher Weg, dies zu tun:
quelle
Der Javadoc für refEq erwähnte, dass die Gleichheitsprüfung flach ist! Weitere Details finden Sie unter dem folgenden Link:
[ https://static.javadoc.io/org.mockito/mockito-core/2.2.29/org/mockito/ArgumentMatchers.html#refEq(T,%20java.lang.String...)[1]
Das Problem "flache Gleichheit" kann nicht gesteuert werden, wenn Sie andere Klassen verwenden, die die Methode .equals () nicht implementieren. Die Klasse "DefaultMongoTypeMapper" ist ein Beispiel, in dem die Methode .equals () nicht implementiert ist.
org.springframework.beans.factory.support bietet eine Methode, mit der eine Bean-Definition generiert werden kann, anstatt eine Instanz des Objekts zu erstellen, und die zum Entfernen von Vergleichsfehlern verwendet werden kann.
** "Die Bean-Definition ist nur eine Beschreibung der Bean, keine Bean selbst. Die Bean-Beschreibungen implementieren equals () und hashCode () ordnungsgemäß. Anstatt einen neuen DefaultMongoTypeMapper () zu erstellen, geben wir eine Definition an, die spring sagt, wie es ist sollte eine erstellen "
In Ihrem Beispiel können Sie so etwas tun
quelle
Eine vereinfachte Lösung, ohne eine neue Matcher-Implementierungsklasse zu erstellen und den Lambda-Ausdruck zu verwenden:
quelle