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:
- Gdy zwracana wartość jest stała –
thenReturn
sprawdzi się idealnie w sytuacjach, gdy za każdym razem oczekujesz tej samej odpowiedzi, bez względu na parametry. - Gdy zwracana wartość zależy od argumentów lub kontekstu wywołania –
thenAnswer
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.