Un'altra opzione è quella di fare affidamento sul buon vecchio equals
metodo di moda . Fintanto che l'argomento nella when
derisione è equals
l'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 any
matcher. Come revisore del codice, tengo d'occhio any
il 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' Answer
oggetto di Mockito che può essere usato con il when
metodo. Answer
consente di intercettare la chiamata effettiva e ispezionare l'argomento di input e restituire un oggetto simulato. Nell'esempio che segue sto usando any
per intercettare qualsiasi richiesta al metodo che viene deriso. Ma poi nella Answer
lambda, posso esaminare ulteriormente l'argomento Bazo ... forse per verificare che gli sia stato passato un documento di identità. Preferisco questo any
da 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 Answer
controllare l'argomento.