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. Анотація @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");
}
}
Ці два приклади коду рівнозначні.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ