Eine andere Möglichkeit ist, sich auf eine gute altmodische equals
Methode zu verlassen. Solange das Argument im when
Mock mit equals
dem 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 someField
wird, können Sie ihn so verspotten.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
Profis: Dies ist expliziter als any
Matcher. Als Prüfer von Code halte ich ein Auge offen für any
den 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 Answer
Objekt, das mit der when
Methode verwendet werden kann. Answer
Mit dieser Option können Sie den tatsächlichen Aufruf abfangen, das Eingabeargument überprüfen und ein Scheinobjekt zurückgeben. Im folgenden Beispiel any
fange ich jede Anfrage an die verspottete Methode ab. Aber dann Answer
kann ich im Lambda das Bazo-Argument weiter untersuchen ... vielleicht um zu überprüfen, ob ihm ein korrekter Ausweis übergeben wurde. Ich ziehe dies any
allein 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 , Answer
um das Argument zu untersuchen.