2.1 Adnotacja @Mock
Istnieją dwa sposoby pracy z makiety obiektów w Mockito. Pierwszym jest stworzenie w pełni wirtualnego obiektu , drugim jest zawinięcie istniejącego obiektu w opakowanie. Zacznijmy od pierwszego.
Aby stworzyć w pełni wirtualny obiekt, należy napisać kod:
ClassName variable name = Mockito.mock(ClassName.class);
Stwórzmy przykładową klasę ArrayList:
@ExtendWith(MockitoExtension.class)
class MockTest {
@Test
public void whenNotUseMockAnnotation_thenCorrect() {
List mockList = Mockito.mock(ArrayList.class);
//these methods won't do anything - they are stubs
mockList.add("one");
mockList.add("two");
}
}
W tym przykładzie tworzymy fałszywą listę ArrayList i zapisujemy do niej odwołanie w zmiennej mockList. Metody tego obiektu nic nie robią.
Nawiasem mówiąc, ten kod można zapisać jeszcze krócej, ponieważ jest do tego specjalna adnotacja @Mock
.
@ExtendWith(MockitoExtension.class)
class MockTest {
@Mock
List mockList;
@Test
public void whenNotUseMockAnnotation_thenCorrect() {
//these methods won't do anything - they are stubs
mockList.add("one");
mockList.add("two");
}
}
W drugim przypadku MockitoExtension
sam przeanalizuje kod klasy i utworzy niezbędne kody pośredniczące. Nie musisz wywoływać metody Mockito.mock()
. Jedna adnotacja i wirtualny obiekt gotowy. Uroda.
2.2 Adnotacja @Spy
Drugim ważnym typem obiektów w Mockito są nakładki na istniejące obiekty. Pozwalają one z jednej strony na wykorzystanie istniejących klas, az drugiej strony na przechwytywanie wywołań wszystkich metod i zmiennych takich obiektów, aby w razie potrzeby poprawić ich działanie. Używane są równie często jak obiekty Mock.
Aby utworzyć opakowanie na obiekcie, musisz napisać kod:
ClassName variable name = Mockito.spy(an object);
Przykład z opakowaniem wokół klasy ArrayList:
@ExtendWith(MockitoExtension.class)
class SpyTest {
@Test
public void whenMockAnnotation() {
List<String> mockList = Mockito.spy(new ArrayList<String>());
//these methods will work!
mockList.add("one");
mockList.add("two");
}
}
W najprostszej formie wywołanie obiektu opakowującego po prostu przekierowuje wywołania do oryginalnego obiektu, do którego odniesienie jest przechowywane w sobie . Wszystko będzie działać tak, jak z oryginalnym obiektem.
Możesz także utworzyć opakowanie za pomocą adnotacji - @Spy
.
@ExtendWith(MockitoExtension.class)
class SpyTest {
@Spy
List mockList = new ArrayList<String>();
@Test
public void whenMockAnnotation() {
// these methods will work!
mockList.add("one");
mockList.add("two");
}
}
Te dwa przykłady kodu są równoważne.
GO TO FULL VERSION