Mockito w testach jednostkowych: Matchers, wyjątki i ArgumentCaptor.

Cześć drogi czytelniku 🙂 ! Dzisiejszy artykuł przeznaczyłam na opisanie Mockito w testach jednostkowych. Skupiałam się tutaj na podstawowych funkcjonalnościach. Drogi czytelniku zapraszam Cię również do przeczytania również artykułu: “Piramida, diament i trofeum – jak rozplanować testy automatyczne w aplikacji”Przemka Bykowskiego. Znajdziesz tam informacje na temat testów jednostkowych, integracyjnych oraz E2E – zapraszam 🙂 .

A teraz zapraszam Cię do dalszej części artykułu na temat: Matchers, wyjątki i ArgumentCaptor. Dowiedzmy się więcej tego z dalszej części 🙂 .

Argument Matchers wykorzystywane są gdy chcemy przetestować metodę ale nie wiemy z jakim argumentem. I tak np. kontynuując przykład z wpisu: Weryfikacja wywołań metod na Mockach sprawdzenie czy metoda canHandleCart zostanie wywołana z parametrem cart:

given(cartHandler.canHandleCart(cart)).willReturn(true);

może zostać zapisana z wykorzystaniem matchera “any” który przejmuje każdą wartość. Wówczas zapis będzie wyglądał następująco:

 given(cartHandler.canHandleCart(any())).willReturn(true);

Współpracując z tym Matcherem metodę tą możemy zapisać również w następujący sposób:

given(cartHandler.canHandleCart(any(Cart.class))).willReturn(true);

– dzięki temu że matchers “any” sprecyzowaliśmy o wartość klasy Cart – any będzie precyzowało tylko argumenty klasy Cart.

Dobre praktyki jednak mówią iż jeżeli jest to tylko możliwe używać matchersów danego typu. Więc jeśli gdzieś jest wymagany int najlepiej zastosować anyInt(). Z matchersów możemy także korzystać z wykorzystaniem metody verify oraz then.should() np.:

verify(cartHandler, atLeastOnce()).sendToPrepare(any(Cart.class));

W sytuacji gdy metoda składa się z kilku parametrów to decydując się na wykorzystanie matchersów powinniśmy konsekwentnie w ten sposób zdefiniować każdy parametr.

Warto również wiedzieć że metoda given().willReturn() możne przyjmować kilka parametrów.:

given(cartHandler.canHandleCart(cart)).willReturn(true, false); 
//then
assertThat(cartHandler.canHandleCart(cart), equalTo(true));
assertThat(cartHandler.canHandleCart(cart), equalTo(false));

Również w miejscu matchera możemy skorzystać z wyrażeń lambda w miejscu wartości lub matchera. Wykorzystujemy do tego metodę boolean argThat, która znajduje się w klasie ArgumentMatchers w bibliotece Mockito.

given(cartHandler.canHandleCart(argThat(c -> cart.getOrders().size > 0))).willReturn(true,false);

Wyjątki

Natomiast aby przetestować możliwość generowania wyjątków przez naszą metodę korzystając z metody testowej given() zamiast willReturn() korzystamy z willThrow(): i sprawdzamy asercją assertThrow.

given(cartHandler.canHandleCart(cart)).willThrow(IllegalStateException.class);
assertThrow(IllegalStateException.class, () -> cartService.processCart(cart));

Argument Captor

ArgumentCaptor służy do sprawdzenia z jakimi argumentami została wywołana dana metoda.

ArgumentCaptor<określamy jakiego typu bedzie argument>  argumentCaptor = ArgumentCaptor.forClass(Cart.class);
Dla naszego przykładu Cart będzie to więc wyglądać następująco: 
ArgumentCaptor<Cart> argumentCaptor = ArgumentCaptor.forClass(Cart.class); 

Leave a Comment

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *