Un'altra opzione è quella di fare affidamento sul buon vecchio equalsmetodo di moda . Fintanto che l'argomento nella whenderisione è equalsl'argomento nel codice testato, allora Mockito corrisponderà alla derisione.
Ecco un esempio
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 );
}
}
quindi, supponendo che tu sappia quale sarà il valore someField, puoi deriderlo in questo modo.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
pro: questo è più esplicito dei anymatcher. Come revisore del codice, tengo d'occhio anyil codice che gli sviluppatori junior scrivono, mentre dà un'occhiata alla logica del loro codice per generare l'oggetto appropriato che viene passato.
con: A volte il campo che viene passato all'oggetto è un ID casuale. In questo caso non è possibile creare facilmente l'oggetto argomento previsto nel codice di simulazione.
Un altro possibile approccio è usare l' Answeroggetto di Mockito che può essere usato con il whenmetodo. Answerconsente di intercettare la chiamata effettiva e ispezionare l'argomento di input e restituire un oggetto simulato. Nell'esempio che segue sto usando anyper intercettare qualsiasi richiesta al metodo che viene deriso. Ma poi nella Answerlambda, posso esaminare ulteriormente l'argomento Bazo ... forse per verificare che gli sia stato passato un documento di identità. Preferisco questo anyda solo in modo che almeno un po 'di ispezione venga fatta sull'argomento.
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;
} );
Quindi, per riassumere, mi piace fare affidamento su equals(dove l'argomento atteso e l'argomento reale dovrebbero essere uguali tra loro) e se uguale non è possibile (a causa della non essere in grado di prevedere lo stato dell'argomento effettivo), farò ricorso per Answercontrollare l'argomento.