JavaRush /Курси /Модуль 3. Java Professional /Основні інструкції Mockito

Основні інструкції Mockito

Модуль 3. Java Professional
Рівень 4 , Лекція 1
Відкрита

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");
    }
}

Ці два приклади коду рівнозначні.

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ