5.1 Методът verify().

В допълнение към създаването на виртуални обекти често възниква друга интересна задача - да се уверите, че тестваният клас извиква правилните методи на правилните обекти. Освен това той се обади необходимия брой пъти, с правилните параметри и други подобни.

За това Mockito също има няHowва магия - семейство от методи Mockito.verify(…). Общото правило, което определя проверката на извикване на метод, е:

Mockito.verify(an object).method name(parameter);

Пример:

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

    @Test
    public void whenMockAnnotation() {
        //method call
        String name = mockList.get(10);

        // check if the method was called
        Mockito.verify(mockList).get(10);
    }
}

По време на извикването на метода verify()задаваме правилото, че mockitoListметодът с параметър 10 трябва да бъде извикан на обекта get().

5.2 Методът verify() с проверка на броя повиквания

Понякога има по-сложни сценарии за проверка. Например, трябва да проверите не само факта, че методът е бил извикан, но например, че е бил извикан 3 пъти. Или е бил извикан от вас в цикъл и следователно е трябвало да бъде извикан N пъти.

Няма да питаме дали това може да стане, веднага ще попитаме: How да запишем такова правило? И отново Mockito не ни разочарова. Правилото може да бъде определено като:

Mockito.verify(an object,quantity).method name(parameter);

важно! Количеството не е тип int, а специален обект, който може да дефинира различни модели. Помните ли различните версии на метода any()? Тук е същото - има специални методи, с които можете да зададете различни сценарии:

Метод Описание
1 никога() Методът никога не трябва да се извиква
2 пъти (n) n пъти
3 най-малко (n) n or повече пъти
4 поне веднъж() 1 or повече пъти
5 най-много(n) n or по-малко пъти
6 само() Трябва да има само едно извикване и само към този метод

Пример:

String name1 = mockList.get(1);  //method call
String name2 = mockList.get(2);  //method call
String name3 = mockList.get(3);  //method call

//check that the get() method was called 3 times
Mockito.verify(mockList, times(3)).get(anyInt());

Можете също така да изисквате, освен посочените извиквания на метод, да не се правят други препратки към обекта . Има правило за това:

Mockito.verifyNoMoreInteractions(an object);

5.3 Ред на извикване на метод

Предишните правила не регулираха по ниHowъв начин реда на извикване на методите. Правилото просто трябва да се изпълни и това е. Но има ситуации, когато редът на извикване на методите е важен и Mockito има решение и за това.

Стриктен ред на извиквания на методи може да бъде определен с помощта на специален обект InOrder. Първо трябва да го създадете:

InOrder inOrder = Mockito.inOrder(an object);

И след това добавете правила към него чрез извикване на методи 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(exception.class, () -> an object.methodname());

Нищо сложно.

Пример:

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

    @Test
    public void whenMockAnnotation() {
        //set the behavior of the method (needed for demonstration purposes only)
        Mockito.when(mockList.size()).thenThrow(IllegalStateException.class);

        //check if an IllegalStateException will be thrown when calling the size method
        assertThrows(IllegalStateException.class, () -> mockList.size());
    }
}