Wpis z mikrobloga

#java #spring
pomoże ktoś? Nie za bardzo wiem jak powinny te testy wyglądać i jak zrobić żeby działało no i ogólnie czy tak można zrobić

Tutaj obrazki (schemat i jak wyglada zwracany obiekt user): https://imgur.com/a/G4I1FMm

No a tutaj aktualny kod testu: https://paste.ofcode.org/cnip8SKDZpdngyyVTMpCBs

pomyślałem że w sumie to każdą moją klasę mogę sprawdzić własnie takimi mockowymi obiektami (że np wywołuję UserController.addUser(json) z moim jsonem, wiem co powinno wyjść więc mockUserService zwracałby tego usera że niby zapisał i pobrał z bazy danych a w tescie samym sprawdzalbym czy faktycznie to samo wyszlo), ale strasznie duzo kodu musiałbym napisać (do każdej metody w każdej klasie, plus jeszcze weź to pozmieniaj np przy dodawaniu nowego pola w encji) i mam wątpliwości, że przecież muszą być lepsze rozwiązania ¯\_(ツ)_/¯
  • 13
@Bruno_: mockujesz serwis zeby zwracal to co chcesz. Czyli odpalasz adduser i mockujesz wszystko to co uzywa servisy itp. Ja bym zaczal testy od sercisow a pozniej controllery. I w sumie nie wiem czy nie odpala sie wtedy testow intergracyjnych na kontrolery dawno w springu nie pisalem.
w tym akurat przykladzie bym zmockowal ten serwis i zrobil ze kiedy odpalana jest metoda adduser z serwisu to zwroc cos.
@doubt no dobra ale w serwisach ten sam problem :( w sumie to wlasnie zaczalem zabawe z tym co dostarcza spring do testowania tj. jakies @DataJpaTest czy cos

Tak szczerze to sie pogubilem troche w tym xD
@Bruno_: zacznij od ustalenia czy piszesz testy jednostkowe czy integracyjne.

Jak jednostkowe, to nie powinny one dotykać springa, bo stawianie kontekstu kosztuje sporo. Wtedy korzystasz tylko z biblioteki do mocków i wstrzykujesz sobie do testowanej klasy mocki zależności zewnętrznych.

To o czym mówisz, czyli MockMvc i inne springowe rzeczy stosuje się w testach integracyjnych gdzie stawiasz cały kontekst (najczęściej z jakąś bazą/brokerem in memory/wiremockiem) i wtedy już testujesz całość na zasadzie,
@Bruno_: Rób sobie integracyjne testy kontrolerów razem z @SpringBootTest i @RunWith(SpringRunner.class), możesz wtedy stestować praktycznie cały endpoint. Nie musisz wtedy mockować, rzucasz na autowired co chcesz + możesz sobie stworzyć interceptor testowy. (np. jakąś fabrykę z @PostConstruct która ci będzie bazę danych wypełniać przed testem. Mocki są dobre do jednostkowych jak chcesz sprawdzić pojedyńczą logikę (czy np ci prawidłowo stream coś zwróci w przypadkach granicznych. Generalnie przy standardowej architekturze REST