Przegląd adnotacji w Mockito

W ramach tego wpisu zrobimy przegląd wszystkich dostępnych w Mockito adnotacji. Skupimy się na tych, które są częścią API, pominiemy natomiast te wewnętrzne.

@Captor

Umożliwia wygodne tworzenie ArgumentCaptor czyli mechanizmu do przechwytywania wartości parametru z jakim został uruchomiony mock.

@DoNotMock

Adnotacja do oznaczania typów, które nie powinny być mockowane. Zamiast tego należy użyć innych sposobów dostarczania implementacji w celach przeprowadzenia testów.

@InjectMocks

Tworzy wskazany obiekt i wstrzykuje do niego mocki. Używany w połączeniu z MockitoAnnotations.openMocks().

@Mock

Tworzy mock. Używany w połączeniu z MockitoAnnotations.openMocks().

@Spy

Tworzy spy'a, połowiczny mock. Można dzięki temu zmockować tylko część metod w klasie, a dla pozostałej części pozostawić oryginalną funkcjonalność. Używany w połączeniu z MockitoAnnotations.openMocks().

@MockitoSettings

Ta adnotacja pochodzi z dodatkowej biblioteki org.mockito:mockito-junit-jupiter, a nie org.mockito:mockito-core jak wszystkie do tej pory. Można jej użyć zamiast @ExtendWith(MockitoExtension.class). Pozwala na ustawienie poziomu surowości (ang. strictness) dla mocków. Domyślny poziom to Strictness.STRICT_STUBS, co znaczy tyle, że Mockito rzuci wyjątkiem, jeśli na mocku zostanie zdefiniowane zachowanie, ale nigdy nie zostanie ono wywołane. Wskazuje to na niepotrzebne akcje w teście i w związku z tym jest odradzane.

Marker interfaces

Poniższe adnotacje nie wprowadzają żadnej funkcjonalności per se, tworzą tylko część dokumentacji.

@Incubating

Służy do oznaczania funkcjonalności, które należy traktować jako testowe, w fazie inkubacji (stąd nazwa). Kiedyś były nim oznaczone takie interfejsy jak np. Answer1, Answer2, ..., Answer5, VoidAnswer1. Teraz już tej adnotacji nie posiadają, wychodzi więc na to, że stały się pełnoprawną częścią biblioteki.

@NotExtensible

Wskazuje użytkownikowi, że nie powinien dostarczać niestandardowych implementacji danego typu. Pomaga integratorom frameworków i użytkownikom Mockito zrozumieć, jak bezpiecznie korzystać z API Mockito, bez ryzyka narażenia się na niekompatybilne zmiany. Niektóre typy, które są częścią publicznego API Mockito, nie są przeznaczone do rozszerzenia. Dzieje się tak dlatego, że zespół Mockito musi mieć możliwość dodawania nowych metod do niektórych typów bez naruszania umowy kompatybilności. Twórcy Mockito potrzebują elastyczności w dodawaniu nowych metod do niektórych typów, aby w razie potrzeby rozwijać API. Typy publiczne to wszystkie typy, które nie należą do pakietu org.mockito.internal.

Brak adnotacji NotExtensible na typie nie oznacza, że jest on przeznaczony do rozszerzenia. Adnotacja ta została wprowadzona późno i dlatego nie jest często używana w bazie kodu. Wiele publicznych typów z API Mockito nie jest przeznaczonych do rozszerzenia, nawet jeśli nie mają zastosowanej tej adnotacji.

Adnotacje dla twórców bibliotek

@CheckReturnValue

Adnotacja ta nie powinna być używana przez użytkowników końcowych Mockito. Zamiast tego używana jest do adnotowania metod dla narzędzi analizy statycznej, w tym FindBugs i ErrorProne. Narzędzia te mogą sprawdzić, czy wartość zwracana naszych metod Mockito jest faktycznie używana. W związku z tym walidacja stanu Mockito może być wykonywana w czasie kompilacji, a nie w czasie wykonywania.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.