5.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.
5.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(объект);
5.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();
5.4 Проверка исключений в Mockito
Факт того, что исключения возникли, проверяется немного по другому. Для этого нужно использовать метод assertThrows()
. Общий формат такой проверки имеет вид:
Assertions.assertThrows(исключение.class, () -> объект.имяМетода());
Ничего сложного.
Пример:
@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());
}
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ