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");
}
}
Эти два примера кода эквиваленты.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ