Inną opcją jest poleganie na dobrej starej equalsmetodzie mody . Dopóki argument w whenmakiecie equalsjest argumentem w testowanym kodzie, Mockito będzie pasował do makiety.
Oto przykład.
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 );
}
}
zakładając, że wiesz, jaka będzie wartość someField, możesz wyśmiewać to w ten sposób.
when(fooDao.getBar(new MyPojo(expectedSomeField))).thenReturn(myFoo);
plusy: jest to bardziej wyraźne niż anydobijacze. Jako recenzent kodu, mam oko na anykod, który piszą młodsi programiści, gdy przegląda logikę swojego kodu, aby wygenerować odpowiedni przekazywany obiekt.
con: Czasami pole przekazywane do obiektu jest losowym identyfikatorem. W tym przypadku nie można łatwo zbudować oczekiwanego obiektu argumentu w kodzie próbnym.
Innym możliwym podejściem jest użycie Answerobiektu Mockito, którego można użyć z tą whenmetodą. Answerpozwala przechwycić rzeczywiste wywołanie, sprawdzić argument wejściowy i zwrócić próbny obiekt. W poniższym przykładzie używam anydo przechwycenia dowolnego żądania wyśmiewanej metody. Ale w Answerlambda mogę dalej sprawdzić argument Bazo ... może w celu zweryfikowania, czy przekazano mu odpowiedni identyfikator. Wolę to nad anysobą, aby przynajmniej przeprowadzić kontrolę argumentu.
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;
} );
Podsumowując, lubię polegać na equals(gdzie oczekiwany argument i rzeczywisty argument powinny być sobie równe) i jeśli równość nie jest możliwa (z powodu niemożności przewidzenia rzeczywistego stanu argumentu), ucieknę się do Answerwglądu do argumentu.