2.1 Аннотация @Mock

Есть два способа работы с мок-объектами в Mockito. Первый – это создать полностью виртуальный объект, второй – это обернуть существующий объект в некую обертку. Начнем с первого.

Чтобы создать полностью виртуальный объект, нужно написать код:

ИмяКласса имяПеременной = Mockito.mock(ИмяКласса.class);

Давайте ради примера создадим мок класса ArrayList:


@ExtendWith(MockitoExtension.class)
class MockTest {
    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        List mockList = Mockito.mock(ArrayList.class);
        //эти методы не будут ничего делать – это заглушки
        mockList.add("one");  
        mockList.add("two");
    }
}

В этом примере мы создаем фейковый объект типа ArrayList и сохраняем ссылку на него в переменную mockList. Методы этого объекта ничего не делают.

Кстати, этот код можно записать еще короче, так как для этого есть специальная аннотация @Mock.


@ExtendWith(MockitoExtension.class)
class MockTest {
    @Mock
    List mockList;
 
    @Test
    public void whenNotUseMockAnnotation_thenCorrect() {
        //эти методы не будут ничего делать – это заглушки
        mockList.add("one");  
        mockList.add("two");
    }
}

Во втором случае MockitoExtension сам проанализирует код класса и создаст нужные заглушки. Вызывать метод Mockito.mock() не нужно. Одна аннотация и виртуальный объект готов. Красота.

2.2 Аннотация @Spy

Второй важный тип объектов в Mockito – это обертки над существующими объектами. Они позволяют с одной стороны пользоваться уже существующими классами, а с другой – перехватывать обращение ко всем методам и переменным таких объектов: подкорректировать их работу, где это нужно. Используются так же часто, как и Mock-объекты.

Чтобы создать обертку над объектом, нужно написать код:

ИмяКласса имяПеременной = Mockito.spy(объект);

Пример с оберткой вокруг класса ArrayList:


@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Test
    public void whenMockAnnotation() {
        List<String> mockList = Mockito.spy(new ArrayList<String>());
        //эти методы будут работать!
        mockList.add("one");  
        mockList.add("two");
    }
}

В самом простом варианте обращение к объекту-обертке просто перенаправляет вызовы к оригинальному объекту, ссылку на который он хранит у себя внутри. Все будет работать, как и с оригинальным объектом.

Создать обертку так же можно с помощью аннотации – @Spy.


@ExtendWith(MockitoExtension.class)
class SpyTest {
    @Spy
    List mockList = new ArrayList<String>();
 
    @Test
    public void whenMockAnnotation() {
        // эти методы будут работать!
        mockList.add("one");  
        mockList.add("two");
    }
}

Эти два примера кода эквиваленты.