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