Inną opcją jest poleganie na dobrej starej equals
metodzie mody . Dopóki argument w when
makiecie equals
jest 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ż any
dobijacze. Jako recenzent kodu, mam oko na any
kod, 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 Answer
obiektu Mockito, którego można użyć z tą when
metodą. Answer
pozwala przechwycić rzeczywiste wywołanie, sprawdzić argument wejściowy i zwrócić próbny obiekt. W poniższym przykładzie używam any
do przechwycenia dowolnego żądania wyśmiewanej metody. Ale w Answer
lambda mogę dalej sprawdzić argument Bazo ... może w celu zweryfikowania, czy przekazano mu odpowiedni identyfikator. Wolę to nad any
sobą, 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 Answer
wglądu do argumentu.