Mockito

Framework Mockito to jedno z najpopularniejszych narzędzi do testowania w języku Java, szczególnie przydatne do tworzenia testów jednostkowych. Jednym z najważniejszych zadań podczas tworzenia testów jest symulowanie zachowania obiektów, by sprawdzić, jak testowany kod na nie reaguje. Mockito pozwala osiągnąć to poprzez stubbing metod za pomocą thenReturn i thenAnswer. Chociaż na pierwszy rzut oka mogą wyglądać podobnie, każda z tych metod służy nieco innemu celowi.


thenReturn — proste zwracanie wartości

Metoda thenReturn jest używana do zwrócenia statycznej, określonej wartości za każdym razem, gdy metoda mockowana zostanie wywołana. Jest ona prostsza i najbardziej przydatna w sytuacjach, w których zależymy od jednej, stałej wartości w testach.

Przykład użycia thenReturn:

// Stworzenie mockowanego obiektu
List<String> mockList = Mockito.mock(List.class);

// Ustawienie zwracanej wartości
Mockito.when(mockList.get(0)).thenReturn("Hello, Mockito!");

// Test: każdorazowe wywołanie metody `get(0)` zwróci tę samą wartość
assertEquals("Hello, Mockito!", mockList.get(0));
assertEquals("Hello, Mockito!", mockList.get(0));

W powyższym przykładzie, metoda get(0) mockowanej listy zawsze zwróci wartość "Hello, Mockito!". thenReturn jest więc idealnym wyborem, gdy chcesz upewnić się, że metoda zawsze będzie zwracała taką samą, niezmienną wartość.


thenAnswer — dynamiczne zwracanie wartości

Metoda thenAnswer jest bardziej elastyczna, pozwala bowiem zwrócić dynamicznie generowaną wartość na podstawie wywołania metody. Umożliwia to dopasowanie zwracanej wartości do kontekstu wywołania, dzięki czemu świetnie sprawdza się w bardziej złożonych scenariuszach.

Przykład użycia thenAnswer:

List<String> mockList = Mockito.mock(List.class);

// Ustawienie dynamicznie zwracanej wartości
Mockito.when(mockList.get(Mockito.anyInt())).thenAnswer(invocation -> {
Integer index = invocation.getArgument(0); // Pobranie argumentu z wywołania
return "Dynamic value for index: " + index;
});

// Test: różne wartości zwrócone na podstawie argumentu wywołania
assertEquals("Dynamic value for index: 0", mockList.get(0));
assertEquals("Dynamic value for index: 1", mockList.get(1));

Tutaj thenAnswer pozwala na generowanie wartości w zależności od argumentu wywołania. W thenAnswer otrzymujemy dostęp do obiektu InvocationOnMock, który zawiera szczegóły dotyczące wywołania metody, co umożliwia bardziej rozbudowane logiki.


Kiedy używać thenReturn, a kiedy thenAnswer?

Wybór między thenReturn a thenAnswer zależy od potrzeb testu:

  1. Gdy zwracana wartość jest stałathenReturn sprawdzi się idealnie w sytuacjach, gdy za każdym razem oczekujesz tej samej odpowiedzi, bez względu na parametry.
  2. Gdy zwracana wartość zależy od argumentów lub kontekstu wywołaniathenAnswer jest najlepszym wyborem, jeśli potrzebujesz dostosować odpowiedź do dynamicznie zmieniających się parametrów lub chcesz zasymulować bardziej skomplikowane zachowania.

Summary

  • thenReturn jest prostszą metodą, używaną do zwracania jednej, określonej wartości.
  • thenAnswer umożliwia bardziej złożone, dynamiczne zachowanie, które reaguje na argumenty wywołania.

Obydwie metody są kluczowe w procesie testowania jednostkowego, a ich odpowiednie zastosowanie może znacząco zwiększyć przejrzystość i elastyczność testów. Wybór odpowiedniego podejścia zależy głównie od tego, jakiej logiki potrzebujesz w swoim mockowanym obiekcie – stałej czy dynamicznej.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *

three + five =