Jaki jest sens użycia JUnit i Mockito jeżeli sami podajemy logikę?

2

Cześć wszystkim ! Mam ciągły problem ze zrozumieniem JUnit testów, testy integracyjne ogarnąłem w pół godziny, JUnit - nie mogę przez kilka miesięcy.

Jaki jest sens testowania metod jeżeli sami wskazujemy na przykład:

 when(userRepository.findByEmail("[email protected]")).thenThrow(NotFoundException.class);

My sami zaznaczamy co chcemy dostać po wywołaniu metody z repozytorium i co bardzo dziwne jak na mnie - i to jest jedyna rzecz której nie mogę zrozumieć. Jaki jest sens takiego testowania, bo przy pierwszej zmianie w metodzie - test się posypie w ryj błędami

Dalej oczywiście sprawdzamy wynik i to jest zrozumiałe

assertThrows(IllegalArgumentException.class, () -> userService.getByEmail("[email protected]"));
2

jeśli nie masz żadnych warunków, algorytmu, czy jak to sobie nazwiesz poza pobieraniem danych z bazy danych to nie ma sensu tego testować

edit:
ewentualnie jakoś takie testy można uzasadnić tym, że exception ma poważne znaczenie(sami musicie ocenić). W przyszłości w ramach refactoru ktoś może ten exception obsłużyć w catch, wtedy

assertThrows(IllegalArgumentException.class, () -> userService.getByEmail("[email protected]"));

nie przejdzie

0

Zależy od testowanej logiki. Jeśli mockujesz wszystko oprócz jednej klasy i jej metody to wtedy sprawdzasz czy ta metoda zrobi co ma zrobić dla danych argumentów. Np obrobi argument jakoś a potem przekaże wynik dalej (wtedy verify). Lub rzuci błąd i nie przekaże nic dalej.

2
Władyslaw Parchomenko napisał(a):

Jaki jest sens takiego testowania, bo przy pierwszej zmianie w metodzie - test się posypie w ryj błędami

I bardzo dobrze kombinujesz - lepiej niż wiele seniorów. Serio.

To jest właśnie problem z mockami - refaktorujesz metodę, pod kątem biznesowym nic się nie zmieniło, a testy na czerwono. Dlatego fajnie jest stosować podejście funkcyjne - podajesz argumenty metody, sprawdzasz output i elo. A jak dana klasa potrzebuje dodatkowych zależności, to można zrobić testowy setup, podczas którego dostarczamy potrzebne zależności i nagle w ogóle nie potrzeba mocków ;)

1

@Władyslaw Parchomenko: no ten przykład który podałeś nie ma żadnego sensu, bo sprawdzasz czy mock zadziałał :D Takie coś robi sie kiedy testujesz pewną funkcje która zależy od innych i chcesz tą zależność skonfigurować. Założmy więc że masz kod który wysyła maila do użytkownika o podanym ID boolean sendEmail(int id). Ta metoda pod spodem odczytuje z bazy email tego użytkownika a następnie wysyła maila. Jeśli piszesz test dla tego kodu, to fajnie byłoby przetestować co się stanie:

  1. Kiedy wszystko jest ok
  2. Kiedy uzytkownika o takim id nie ma w bazie
  3. Kiedy baza się wysypała
  4. Kiedy wysłanie maila sie wysypało

Jeśli z jakiegoś powodu bardzo chcesz to robić jednostkowo (zamiast użyć h2/hsql albo bazy z testcontainers) to możesz zmockować repozytorium, żeby skonfigurować sobie odpowiedź do każdego z tych punktów. Weź pod uwagę że nie testujesz tu tego pobierania emaila, tylko testujesz logikę sendEmail.

Niemniej zalecam nie zawracać sobie takimi rzeczami głowy i zapoznać się z https://github.com/Pharisaeus/almost-s3 :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1