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