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

Jaki jest sens użycia JUnit i Mockito jeżeli sami podajemy logikę?
Władyslaw Parchomenko
Władyslaw Parchomenko
  • Rejestracja:ponad 6 lat
  • Ostatnio:8 miesięcy
  • Postów:63
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:

Kopiuj
 when(userRepository.findByEmail("user@gmail.com")).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

Kopiuj
assertThrows(IllegalArgumentException.class, () -> userService.getByEmail("user@gmail.com"));
IH
  • Rejestracja:ponad 6 lat
  • Ostatnio:44 minuty
  • Postów:103
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

Kopiuj
assertThrows(IllegalArgumentException.class, () -> userService.getByEmail("user@gmail.com"));

nie przejdzie

edytowany 5x, ostatnio: IHaveHandedInMyResignation
Władyslaw Parchomenko
Władyslaw Parchomenko
Aaaa... czylik jak obsługujemy jakieś dane w serwise, to wtedy testujemy... Dzięki ci wielki, otworzyłeś mi oczy. Po te jebane filmiki na youtube wszystkie pokazują tylko jak co robić ale nie po co i kiedy. I głównie są to jakieś bezużyteczne testy. Dzięki.
LW
  • Rejestracja:prawie 10 lat
  • Ostatnio:ponad 3 lata
  • Lokalizacja:Warszawa
  • Postów:59
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.

PI
  • Rejestracja:ponad 9 lat
  • Ostatnio:5 miesięcy
  • Postów:2787
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 ;)

Władyslaw Parchomenko
Władyslaw Parchomenko
w sensie dobrze kombinuję? W sensie że kumam ten problem?:)
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 2x, ostatnio: Shalom
Władyslaw Parchomenko
Władyslaw Parchomenko
Ziom na górze dobrze powiedział, IHaveHandedInMyResignation, że warto testować gdy w serwisie mamy jakiś algorytm, wtedy to ma znaczenie, w innym przypadku to jest tylko testowanie pobierania danych z repo(czyli tak na prawdę test repo). Nareszcie otworzył mi oczy, to te jebane filmiki z youtube zawsze pokazują bezużyteczne przykłady , pokazują jak testować, ale nie mówią w jakim przypadku i po co
Shalom
Jakby ci ludzie wiedzieli o co chodzi, to by programowali za 20k w korpo a nie robili filmiki na jutuba ;)
Władyslaw Parchomenko
Władyslaw Parchomenko
Też prawda, ale niestety nie mam wyboru, jak zaczynam czytać książki - śpię już po 2 minutach xD Z artykułami prawie tak samo

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.