Obecnie używam Mockito do kpienia z obiektów warstwy usługi w aplikacji Spring MVC, w której chcę przetestować metody kontrolera. Jednak, kiedy czytałem o szczegółach Mockito, odkryłem, że metody doReturn(...).when(...)
są równoważne when(...).thenReturn(...)
. Moje pytanie brzmi: po co są dwie metody, które robią to samo, czy jaka jest subtelna różnica między doReturn(...).when(...)
i when(...).thenReturn(...)
?
Każda pomoc będzie mile widziana.
java
unit-testing
mockito
czarna pantera
źródło
źródło
doReturn()
jest to przydatne.Odpowiedzi:
Obie składnie dla stubowania są w przybliżeniu równoważne. Jednak zawsze możesz użyć
doReturn/when
do stubowania; ale są przypadki, w których nie można użyćwhen/thenReturn
. Jednym z takich sposobów jest stubbingowanie pustek. Inne obejmują używanie szpiegów Mockito i wielokrotne stosowanie tej samej metody.Jedną z rzeczy, która
when/thenReturn
daje ci to, czegodoReturn/when
nie ma, jest sprawdzanie typu zwracanej wartości w czasie kompilacji. Uważam jednak, że nie ma to prawie żadnej wartości - jeśli pomylisz się co do typu, przekonasz się, jak tylko uruchomisz test.Zdecydowanie polecam tylko używać
doReturn/when
. Nie ma sensu uczyć się dwóch składni, kiedy to zrobisz.Możesz odnieść się do mojej odpowiedzi z „Gramatyki” Forming Mockito - bardziej szczegółowej odpowiedzi na bardzo ściśle powiązane pytanie.
źródło
doReturn/when
i spędzam kilka minut zastanawiając się, co poszło nie tak. Sprawdzanie typu kompilacji staje się niezwykle przydatne w przypadkuwhen/thenReturn
.when/thenReturn
zamiastdoReturn/when
.doReturn/when
jest to kompromis. Zespół nie poleca w ten czy inny sposób, ale zauważa, żewhen/then
podejście jest bardziej intuicyjne, bardziej czytelne i oferuje sprawdzanie czasu kompilacji, dzięki temu Mockito stało się popularne i łatwe w użyciu, nie zapominaj, że gdy baza kodu jest udostępniana przez różne umiejętności w zespole; ma jednak wady dotyczące szpiegów i metod pustki.doReturn()
ma tę wielką wadę, że zmienia się w kodowanie wywołań metod w stylu YODA. To, co później przychodzi, jest zapisywane jako pierwsze. Większość ludzi czyta od lewej do prawej; więc teraz musicie stale pamiętać o odwróceniu logiki powrotu w głowie.Oba podejścia zachowują się inaczej, jeśli użyjesz szpiegowanego obiektu (z adnotacją
@Spy
) zamiast próbnego (z adnotacją@Mock
):when(...) thenReturn(...)
wykonuje prawdziwe wywołanie metody tuż przed zwróceniem określonej wartości. Więc jeśli wywoływana metoda zgłosi wyjątek, musisz sobie z tym poradzić / wyśmiewać itp. Oczywiście nadal otrzymujesz swój wynik (to, co definiujeszthenReturn(...)
)doReturn(...) when(...)
w ogóle nie wywołuje tej metody .Przykład:
Test:
źródło
doReturn()
, wygląda na nadużycie biblioteki. Celem szpiegowania zamiast czystego kpienia jest wykorzystanie prawdziwych połączeń. Ostrzegają również przed używaniem Szpiegów w następujący sposób: github.com/mockito/mockito/wiki/Using-Spies-(and-Fakes) (i zalecają rozszerzenie klasy i zastąpienie metody zamiast tego)Wydaje się, że Mockito javadoc mówi, dlaczego należy używać
doReturn()
zamiastwhen()
Use doReturn () w tych rzadkich przypadkach, gdy nie można użyć Mockito.when (Object).źródło
Kontynuując tę odpowiedź , istnieje jeszcze jedna różnica, że jeśli chcesz, aby twoja metoda zwracała różne wartości, na przykład gdy jest wywoływana po raz pierwszy, wywoływana po raz drugi itd., Możesz przekazać wartości, na przykład ...
Więc zwróci false, gdy metoda zostanie wywołana w tym samym przypadku testowym, a następnie zwróci false ponownie i na koniec true.
źródło
Ta ostatnia alternatywa jest używana w przypadku metod na powracających próbach
void
.Spójrz na przykład tutaj: Jak zrobić próbną próbę unieważnienia metod za pomocą mockito
źródło