Eine andere Möglichkeit ist, sich auf eine gute altmodische equalsMethode zu verlassen. Solange das Argument im whenMock mit equalsdem Argument im zu testenden Code übereinstimmt, stimmt Mockito mit dem Mock überein.
Hier ist ein Beispiel.
public class MyPojo {
public MyPojo( String someField ) {
this.someField = someField;
}
private String someField;
@Override
public boolean equals( Object o ) {
if ( this == o ) return true;
if ( o == null || getClass() != o.getClass() ) return false;
MyPojo myPojo = ( MyPojo ) o;
return someField.equals( myPojo.someField );
}
}
Wenn Sie dann wissen, wofür der Wert sein someFieldwird, können Sie ihn so verspotten.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
Profis: Dies ist expliziter als anyMatcher. Als Prüfer von Code halte ich ein Auge offen für anyden Code, den Junior-Entwickler schreiben, da er einen Blick auf die Logik ihres Codes wirft, um das entsprechende Objekt zu generieren, das übergeben wird.
con: Manchmal ist das Feld, das an das Objekt übergeben wird, eine zufällige ID. In diesem Fall können Sie das erwartete Argumentobjekt nicht einfach in Ihrem Scheincode erstellen.
Ein anderer möglicher Ansatz ist die Verwendung von Mockitos AnswerObjekt, das mit der whenMethode verwendet werden kann. AnswerMit dieser Option können Sie den tatsächlichen Aufruf abfangen, das Eingabeargument überprüfen und ein Scheinobjekt zurückgeben. Im folgenden Beispiel anyfange ich jede Anfrage an die verspottete Methode ab. Aber dann Answerkann ich im Lambda das Bazo-Argument weiter untersuchen ... vielleicht um zu überprüfen, ob ihm ein korrekter Ausweis übergeben wurde. Ich ziehe dies anyallein vor, damit zumindest eine gewisse Prüfung des Arguments durchgeführt wird.
Bar mockBar = //generate mock Bar.
when(fooDao.getBar(any(Bazo.class))
.thenAnswer( ( InvocationOnMock invocationOnMock) -> {
Bazo actualBazo = invocationOnMock.getArgument( 0 );
//inspect the actualBazo here and thrw exception if it does not meet your testing requirements.
return mockBar;
} );
Um es zusammenzufassen, ich verlasse mich gerne darauf equals(wo das erwartete Argument und das tatsächliche Argument gleich sein sollten) und wenn Gleichheit nicht möglich ist (weil ich den Zustand des tatsächlichen Arguments nicht vorhersagen kann), greife ich zurück auf , Answerum das Argument zu untersuchen.