tag:blogger.com,1999:blog-7903122543378555744.post5115167817610383049..comments2023-03-10T00:32:08.235-08:00Comments on Blog :: Dragonia: Mockito i TDD - czy aby na pewno?Łukasz "Smok" Rybkahttp://www.blogger.com/profile/03457076856183059722noreply@blogger.comBlogger9125tag:blogger.com,1999:blog-7903122543378555744.post-44891962330894807472010-10-05T11:37:33.522-07:002010-10-05T11:37:33.522-07:00@Mirek
Jak coś ma zależność od 10 innych serwisów,...@Mirek<br />Jak coś ma zależność od 10 innych serwisów, to najprawdopodbniej znaczy że to coś robi za dużo i wymaga refaktora. A wtedy i testy stają się bardziej przejrzyste.Tomekhttps://www.blogger.com/profile/00975651968503643202noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-37174508130240978172010-10-02T04:47:45.815-07:002010-10-02T04:47:45.815-07:00@Tomasz Dziurko
Dzieki za rade właśnie takie coś ...@Tomasz Dziurko <br />Dzieki za rade właśnie takie coś wykonuje, ale na zasadzie, że uruchamiam test który wywołuje pewną metodę serwisową i na końcu sprawdzam czy stan bazy danych jest prawidłowy tzn. taki jak oczekiwałem...tylko tutaj pojawiają się problemy bo testy takie wymagają już kontenera EJB bazy danych itp....choć z drugiej strony testy takie najwierniej symulują środowisko produkcyjneMirekhttps://www.blogger.com/profile/02964116031786388011noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-25977062288097129362010-10-02T01:24:29.943-07:002010-10-02T01:24:29.943-07:00@Mirek
Hmm... trudno mi coś doradzić co na pewno b...@Mirek<br />Hmm... trudno mi coś doradzić co na pewno będzie miało rację bytu, bo pewnie są sytuacje, że takie testy są potrzebne, ale...<br />moim zdaniem, jeśli w serwisie mamy w kolejnych liniach kolejne wywołanie i coś w tych klimatach testujemy to trochę kiepskie podejście, bo testuje się rzecz oczywistą i idąc tym tropem należałoby testować gettery i settery :)<br />Ja przy takim skomplikowanym teście mockowałbym tylko to coś na końcu i sprawdzał, czy po wykoaniu testu końcowy stan finalny tego bytu jest zgodny z oczekiwaniami, czyli że metody i serwisy, które miały coś na nim zrobić to zrobiły.<br />Oczywiście to taka porada na sucho i może okazać się zupełnie oderwana od konkretnej sytuacji u Ciebie :)Tomasz Dziurkohttps://www.blogger.com/profile/12358627841270423332noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-31462421373690896262010-10-01T00:01:25.709-07:002010-10-01T00:01:25.709-07:00@Tomasz Dziurko, @Łukasz "Smok" Rybka
Zg...@Tomasz Dziurko, @Łukasz "Smok" Rybka<br />Zgadzam się sytuacje które podaliście sprawdzają się z mockami bardzo dobrze i zgadzam się, że w takich sytuacjach powinny być one stosowane.<br /><br />Tylko byłem w projekcie w którym ludzie testowali swoje serwisy na zasadzie, że mokowali wszystkie zalezności tego serwisu tzn. AccountService wykorzystuje innych 10 serwisów to mokujemy te 10 i sprawdzamy czy podczas wywołania metody na AccountService wykonały się odpowiednie wywołania na tych 10 serwisach i to w odpowiedniej kolejności. Kod takiego tworu jest strasznie brzydki i sam pomysł testowania w taki sposób mi się nie podoba.<br />Zastanawiam się jak postępujecie w takich sytuacjachMirekhttps://www.blogger.com/profile/02964116031786388011noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-60668201047417351002010-09-30T12:46:50.198-07:002010-09-30T12:46:50.198-07:00@Mirek - ponad to co napisał Tomek od siebie jeszc...@Mirek - ponad to co napisał Tomek od siebie jeszcze dodam, że są sytuacje, kiedy bez mocków nie da się zwyczajnie przetestować. Wystarczy, że Twój komponent komunikuje się z inną aplikacją, która przykładowo w bloku statycznym próbuje komunikować się z innymi webserwisami i na tej podstawie kreować samego siebie. Gdyby nie PowerMock nie dałoby się takiego obiektu wykorzystać w testach.Łukasz "Smok" Rybkahttps://www.blogger.com/profile/03457076856183059722noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-59977216868683915852010-09-30T11:39:57.427-07:002010-09-30T11:39:57.427-07:00@Mirek:
To dam Ci przykład z projektu, w którym te...@Mirek:<br />To dam Ci przykład z projektu, w którym teraz jestem:<br />Projekt ma 3 warstwy: domena + dao, warstwa serwisowa, widok.<br />Implementuję widok i nie ingeruję w warstwy niżej, jedyne co mnie w danym momencie obchodzi i co chcę sprawdzić to czy po kliknięciu w jakiś przycisk wywoła się odpowiednia logika.<br />Przykładowo po kliknięciu "Zapisz" zapisuję nowo utworzonego użytkownika, więc robię tak:<br /><br />// mockuj serwis, którego nie testuje tutaj<br />UserService service = mock(UserService.class)<br /><br />//wstrzyknij ten serwis do strony Wicketa, zeby strona z niego korzystala zamiast z prawdziwego<br />inject(userPage, "userService", service)"<br /><br />wickettester.simulateSaveButtonClick();<br /><br />verify(service.saveUser(any(User.class), times(1));<br /><br />Piszę bez zaglądania w kod, więc małe błędy składniowe mogą być, ale idea jest taka: jeśli testujesz widok, to chcesz sprawdzić jego interakcję z częścią niżej, ta część niżej może nie być gotowa i masz tylko pusty interfejs, który wpinasz w widok. Piszesz test i co by się nie działo, widok masz gotowy i pewny, bo pokryty testem.<br />A jeśli formularz będzie Ajaxowy i bardziej skomplikowany, bo wywołujący metodę na serwisie, gdy na jednym polu masz onChange i inne pole spełnia jakiś warunek, to łatwo coś popsuć przy zmianach, a taki test to pokryje i bez "martwienia się" warstwą serwisową funkcjonalność możesz uznać za zrobioną.Tomasz Dziurkohttps://www.blogger.com/profile/12358627841270423332noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-32138017594965684872010-09-30T06:34:49.963-07:002010-09-30T06:34:49.963-07:00Fajna prezentacja, ale ja w dalszym ciągu nie jest...Fajna prezentacja, ale ja w dalszym ciągu nie jestem przekonany do "mock'owania", jak można pisać testy na zasadzie czy dana metoda obiektu została wykonana 3 czy 5 razy i to w odpowiedniej kolejności...nieraz algorytmy się zmieniają i również interakcje między obiektami...liczy się wynik czyli czy metoda serwisowa spełniła swój kontrakt, a nie, że pod wpływem jej wykonania wywołało się 6 metod insert i 2 updateMirekhttps://www.blogger.com/profile/02964116031786388011noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-58976279042521598932010-09-30T01:32:09.187-07:002010-09-30T01:32:09.187-07:00@Grzegorz - ale prezentowali na sesji WJUG'a, ...@Grzegorz - ale prezentowali na sesji WJUG'a, więc tak ich nazwałem. Czy są z Krakowa, Wrocławia, Gdańska, czy Berlina - nieistotne tak długo, jak robią takie pouczające sesje :) Ale dziękuję za zwrócenie uwagi - zaraz poprawię.Łukasz "Smok" Rybkahttps://www.blogger.com/profile/03457076856183059722noreply@blogger.comtag:blogger.com,1999:blog-7903122543378555744.post-3909323190798647802010-09-29T23:45:02.155-07:002010-09-29T23:45:02.155-07:00Lukasz. To nie chlopaki z WJUGa prezentuja. Szczep...Lukasz. To nie chlopaki z WJUGa prezentuja. Szczepan i Bartek sa z Krakowa i nie sa zwiazani z zadnym JUGiem.Grzegorz Dudahttps://www.blogger.com/profile/05392030070582532567noreply@blogger.com