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

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); 

Bądź pierwszy, który skomentuje ten wpis!

Dodaj komentarz

Twój adres email nie zostanie opublikowany.


*