JavaRush /Курси /Модуль 3. Java Professional /Виявлення певної поведінки у об'єктів

Виявлення певної поведінки у об'єктів

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

1. Метод verify()

Окрім створення віртуальних об'єктів, часто виникає ще одне цікаве завдання – переконатися, що клас, який тестується, викликав потрібні методи потрібних об'єктів. Ба більше, викликав необхідну кількість разів, із правильними параметрами.

Для цього в Mockito теж є трохи магії – сімейство методів Mockito.verify(…). Загальне правило, яким визначається перевірка виклику методу, має вигляд:

Mockito.verify(об'єкт).ім'яМетоду(параметр);

Приклад:


@ExtendWith(MockitoExtension.class)
class VerifyTest {
 @Mock
 List<String> mockList;

 @Test
    public void whenMockAnnotation() {
        //виклик методу
        String name = mockList.get(10);

        //перевіряємо, чи метод викликано
        Mockito.verify(mockList).get(10);
    }
}

Під час виклику методу verify() ми встановили правило, що об'єкт mockitoList має викликати метод get() з параметром 10.

2. Метод verify() з перевіркою кількості дзвінків

Іноді бувають складніші сценарії перевірки. Наприклад, тобі потрібно перевірити не лише факт того, що метод викликано, а й те, що його викликано 3 рази. Або те, що його викликано в циклі, а отже, він мав викликатися N разів.

Ми не питатимемо, чи можна це зробити, ми одразу поцікавимося: як записати таке правило? І знову Mockito нас не підводить. Правило можна вказати таким чином:

Mockito.verify(об'єкт,кількість).ім'яМетоду(параметр);

Важливо! Кількість – це не тип int, а спеціальний об'єкт, який може встановлювати різні шаблони. Пам'ятаєш різні варіанти методу any()? Тут так само є спеціальні методи, за допомогою яких можна вказувати різні сценарії:

Метод Опис
1 never() Метод ніколи не повинен викликатися
2 times(n) n раз
3 atLeast(n) n або більше разів
4 atLeastOnce() 1 або більше разів
5 atMost(n) n або менше разів
6 only() Має бути лише один виклик і лише до цього методу

Приклад:

String name1 = mockList. get(1); //виклик методу String name2 = mockList. get(2); //виклик методу String name3 = mockList. get(3); //виклик методу //перевіряємо, що метод get() викликався 3 рази Mockito.verify( mockList, times(3)).get( anyInt());

Ти також можеш вимагати, щоб окрім вказаних викликів методу інших звернень до об'єкта не було. Для цього є правило:

Mockito.verifyNoMoreInteractions(об'єкт);

3. Порядок виклику методів

Попередні правила не регламентували порядок виклику методів. Правило просто має бути виконано – і все. Але бувають ситуації, коли порядок викликів методів важливий, і для цього в Mockito також є рішення.

Жорсткий порядок виклику методів можна встановити за допомогою спеціального об'єкта InOrder. Спочатку його потрібно створити:

InOrder inOrder = Mockito.inOrder(об'єкт);

А потім вже додавати йому правила за допомогою виклику методів verify().

Приклад:


    List<String> mockedList = mock(MyList.class);
    mockedList.size();
    mockedList.add("a parameter");
    mockedList.clear();
 
    InOrder inOrder = Mockito.inOrder(mockedList);
    inOrder.verify(mockedList).size();
    inOrder.verify(mockedList).add("a parameter");
    inOrder.verify(mockedList).clear();

4. Перевірка винятків у Mockito

Факт виникнення винятків перевіряється трохи інакше. Для цього потрібно використовувати метод assertThrows(). Ось загальний формат такої перевірки:

Assertions.assertThrows(виняток., () -> об'єкт.ім'яМетоду());

Нема нічого складного.

Приклад:


@ExtendWith(MockitoExtension.class)
class ThenThrowTest {
 @Mock
 List mockList;

 @Test
    public void whenMockAnnotation() {
        //встановлюємо поведінку метода (потрібно лише для демонстрації)
        Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);

        //перевіряємо, чи кинеться IllegalStateException під час виклику методу size
        assertThrows(IllegalStateException.class, () -> mockList.size());
    }
}
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ