To świetne pytanie! Myślę, że podstawowa przyczyna tego jest następująca: używamy JUnit nie tylko do testowania jednostkowego. Pytanie powinno zostać podzielone:
- Czy powinienem używać Mockito.verify () w mojej integracji? (lub innych testach jednostkowych)?
- Czy powinienem używać Mockito.verify () w testach jednostkowych w czarnej skrzynce ?
- Czy powinienem używać Mockito.verify () w testach jednostkowych białych skrzynek ?
więc jeśli zignorujemy testy wyższe niż jednostkowe, pytanie można sformułować ponownie: „ Używanie białych testów jednostkowych za pomocą Mockito.verify () tworzy świetną parę między testem jednostkowym a moją możliwą implementacją, czy mogę zrobić trochę „ szarej skrzynki „ testowanie jednostkowe i jakie podstawowe zasady powinienem zastosować do tego ”.
Teraz przejdźmy przez cały ten krok po kroku.
* - Czy powinienem używać Mockito.verify () w mojej integracji (lub innych testach wyższych niż jednostkowe)? * Myślę, że odpowiedź brzmi zdecydowanie nie, poza tym nie powinieneś używać do tego mocków. Twój test powinien być jak najbardziej zbliżony do rzeczywistej aplikacji. Testujesz pełny przypadek użycia, a nie wydzieloną część aplikacji.
* Testowanie jednostkowe czarnej skrzynki a białej skrzynki * Jeśli używasz metody czarnej skrzynki do tego, co naprawdę robisz, podajesz (wszystkie klasy równoważności) dane wejściowe, stan i testy, które otrzymasz oczekiwany wynik. W tym podejściu stosowanie mocków w ogóle jest uzasadnione (po prostu naśladujesz, że robią to dobrze; nie chcesz ich testować), ale wywołanie Mockito.verify () jest zbyteczne.
Jeśli stosujesz podejście „ białej skrzynki”, co naprawdę robisz, testujesz zachowanie swojego urządzenia. W tym podejściu niezbędne jest wywołanie Mockito.verify (), powinieneś sprawdzić, czy twoje urządzenie zachowuje się tak, jak się tego spodziewasz.
podstawowe zasady testowania szarych skrzynek
Problem z testami szarych skrzynek polega na tym, że tworzy ono wysokie sprzęganie. Jednym z możliwych rozwiązań jest przeprowadzenie testu szarej skrzynki, a nie testowanie białej skrzynki. Jest to swego rodzaju połączenie testów czarnych i białych skrzynek. Naprawdę testujesz zachowanie swojego urządzenia, tak jak w przypadku testów białych skrzynek, ale ogólnie czynisz go agnostycznym, jeśli to możliwe . Gdy jest to możliwe, po prostu sprawdzisz, jak w przypadku czarnej skrzynki, po prostu zapewnisz, że wynik jest tym, czego się spodziewasz. Istota twojego pytania brzmi: kiedy jest to możliwe.
To jest naprawdę trudne. Nie mam dobrego przykładu, ale mogę podać przykłady. W przypadku, o którym wspomniano powyżej za pomocą equals () vs equalsIgnoreCase (), nie powinieneś wywoływać Mockito.verify (), po prostu sprawdź dane wyjściowe. Jeśli nie możesz tego zrobić, podziel kod na mniejsze jednostki, dopóki nie będziesz w stanie tego zrobić. Z drugiej strony, załóżmy, że masz trochę @Service i piszesz @ Web-Service, który jest zasadniczo opakowany w twoją @Service - deleguje wszystkie wywołania do @Service (i robi dodatkową obsługę błędów). W takim przypadku wywołanie Mockito.verify () jest niezbędne, nie powinieneś powielać wszystkich swoich kontroli wykonanych dla @Serive, wystarczające jest sprawdzenie, czy dzwonisz do @Service z poprawną listą parametrów.