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());
}
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ