Wpis z mikrobloga

#programowanie #java #spring #testowanieoprogramowania #junit

Polecicie jakiś tutorial do pisania testów jednostkowych aplikacji w Springu? (Najlepiej przy użyciu JUnit, Mockito.)

Większość tutoriali o testach skupia się na samym JUnit albo o tym jak w teorii pisać testy.
Samego JUnita nauczyć się jest łatwo, a teorię o tym jak i co powinno się testować to potem sobie doczytam.

Nie ogarniam trzech rzeczy:

1. Całej tej otoczki Springowej. (Samego Springa bez testów znam.)

- Kiedy jakiego użyć Runnera (w ogóle co to i po co jest), jak uruchomić kontekst Springa (a co jak mam w innym module Mavenowym), jak użyć konfiguracji application.properties i plików z resources z projektu, a nie tylko z folderu test (bo nie chce kopiować wszystkiego i potem 2x zmieniać), ale jak móc mieć konfigurację do testów, w której nadpiszę tylko niektóre rzeczy; jak używać Mockito do mockowania beanów (a nie jak zwykłych klas) itd.

2. Co mockować przy funkcjonalnościach z IO?

- Przykładowo jakaś funkcjonalność, która coś zapisuje do bazy, coś zapisuje na dysk, pobiera coś REST-em i wykonuje pomiędzy tym jakąś logikę.
- Czy mam zamockować wszystko co wchodzi i wychodzi z aplikacji (np. metodę zapisu na dysk i udawać, że ona się zawsze udaje), żeby przetestować samą logikę? Mockować moje prywatne metody, które robią coś na IO czy bazowe metody (np. z bibliotek czy samej Javy)?
- A co jak logika jest bardzo prosta, a właśnie operacje IO są bardziej skomplikowane (np. przenoszenie jakiś plików, tworzenie folderów itd)? Mockując IO nie przetestuję tej logiki (np. że będzie duplikat nazwy pliku w folderze).

3. Testować kontrolery czy serwisy?

- Pisać test na serwis, który przyjmuje biznesowe obiekty czy mockować cały kontroler i udawać, że wysyłam zapytanie. To drugie jest dla mnie trudniejsze, bo muszę korzystać z mechanizmów Springowych do testów, których nie znam; ale widzę, że tak jest w większości tutoriali.
  • 6
@mk321: niektóre pytania napisałeś tak zawile, że ich nie zrozumiałem więc niech ktoś #pdk ale ode mnie (choć mogę się mylić ofc)

Kiedy jakiego użyć Runnera


jeśli chodzi ci o SpringRunner.class to jest to skrócona wersja SpringJUnit4ClassRunner.class (patrz dokumentacja co to robi)

jak użyć konfiguracji application.properties

próbowałeś kombinować z @ActiveProfile && classpath?

ad 3.
każda warstwa powinna działać niezależnie więc testy jednostkowe też piszesz dla każdej warstwy, oddzielnie dla serwisu, repo,
@ciachostko: w pytaniach używałem dużo skrótów myślowych, bo mam dużo pytań, ale ściany tekstu i tak nikt by nie przeczytał. Chciałem tylko pokazać na jaki temat szukam materiałów/tutoriali.

Poczytałbym sobie taki tutorial/książkę/kurs lub jakiś projekt open source, to pewnie bym sam znalazł odpowiedź na większość pytań zamiast kogoś pytać o takie podstawy.

O jakimś runnerze jeszcze powinienem wiedzieć / któregoś używać? Bo który tutorial nie otworzę, to wszędzie jest co innego...
via Wykop Mobilny (Android)
  • 2
@mk321: jak podnosisz context springowy to masz testy integracyjne. Oddzielne testy na kazda klase i testujesz wszystko co w danym pakiecie jest wystawione, a nie tylko publiczne metody. Junit4 skoro mowimy o runnerach, wwiec imo mockitorunner, albo dla jakichs utilsow to parametryzowany runner. Controllery sie testuje z mockmvc I controlleradvice wiec powinno tez walidacje i odpowiedzi na bledy pokryc.
@Myrcin-: myślałem, że jak używam runnera @RunWith(SpringRunner.class) to mam kontekst Springowy, bo mam dostęp do beanów (tak mi się wydawało).

Testy na każdą klasę?
- Ale tylko na każdą serwisową? Chyba nie na klasy modelu, entity, dto, enumów itd?
- A jak wydzieliłem jakąś klasę z innej (i nigdzie indziej jej nie używam), to też powinienem napisać do niej testy? Przecież pokrycie kodu testami będzie takie samo i funkcjonalność przetestowana taka
@mk321: Ale jak Ci wstaje context to juz masz testy integracyjne, a nie junit.

Modele,entity, dto i enumy zostana pokryte przy okazji pisania junitow na serwisy/controllery.

Nikt nie uzywa package privateow oprocz Ciebie, ale Ty uzywasz, wiec powinienes to pokryc.

Z tym testem na kazda klase to nie wiem o czym myslalem jak to pisalem xD

Jesli musisz uzywac powermocka to znaczy, ze cos #!$%@?, albo pracujesz na legacy - unikac.
via Wykop Mobilny (Android)
  • 2
@mk321: testuj logikę a nie czy springowe adnotacje działają, najlepiej też jak nic nie mockujesz

Jeśli testujesz metodę kontrolera który wola serwis który jedyne co robi to wola repo żeby zapisać encje - robisz to źle. W ten sposób przetestowales czy spring działa. Pracownicy pivotala pewnie się ucieszą z dodatkowego testu ( ͡° ͜ʖ ͡°)

Kluczem nie jest 100% coverage-u tylko mądre przetestowanie funkcjonalności, logiki biznesowej