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 MockitoExtensionsam 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.