Przegląd adnotacji w Mockito
Spis treści
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.