3.1 метод doReturn().
Сега идва магията...
Да приемем, че сте създали фалшив макет на обект, но имате нужда от него, за да работи по няHowъв начин. Когато бяха извикани определени методи, беше напequalsо нещо важно or методите върнаха определен резултат. Какво да правя?
Библиотеката Mockito ви позволява да добавите желаното поведение към макет обект.
Ако искате макет обект да върне определен резултат, когато се извика определен метод, тогава това „правило“ може да се добави към обекта с помощта на codeа:
Mockito.doReturn(result).when(an object).method name();
Виждате ли, в края на извикването на метода, method name?
тук всъщност няма извикване. Методът doReturn()
връща специален прокси-обект, с помощта на който следи извикванията на методите на обекта и по този начин се записва правилото.
Отново. Това е просто толкова умен начин да напишете правило, което да добавите към макет обект . Необходими са известни умения, за да интерпретирате правилно такъв code в главата си, когато го видите. Идва с опит.
Мисля, че е необходим конкретен пример. Нека създадем обект на макет на клас ArrayList
и да помолим неговия метод size()
да върне числото 10. Пълният code ще изглежда така:
@ExtendWith(MockitoExtension.class)
class DoReturnTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation () {
//create a rule: return 10 when calling the size method
Mockito.doReturn(10).when(mockList).size();
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
Да, този code ще работи, тестът няма да се провали.
3.2 метод when().
Има друг начин да добавите правило за поведение към макет обект - чрез извикване на Mockito.when()
. Изглежда така:
Mockito.when(an object.method name()).thenReturn(result);
Това е същият начин за писане на правило за поведение на макет на обект като предишния. Сравнете:
Mockito.doReturn(result).when(an object).method name();
Тук се случва абсолютно същото - изграждането на ново правило.
Вярно е, че първият пример има два минуса:
- обаждането е много объркващо.
an object.method name()
- няма да работи, ако методът
methodname()
се върнеvoid
.
Е, нека запишем нашия любим пример, използвайкиMockito.when()
@ExtendWith(MockitoExtension.class)
class WhenTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//create a rule: return 10 when calling the size method
Mockito.when(mockList.size() ).thenReturn(10);
//the method is called here and will return 10!!
assertEquals(10, mockList.size());
}
}
3.3 метод doThrow().
Разбрахме How да накараме метод на фалшив обект да връща конкретен резултат. Как мога да го накарам да хвърли конкретно изключение? Изпратете го на doReturn()
?
За да предотвратите връщането на метода, а именно хвърлянето на изключение, трябва да зададете правилото с помощта на doThrow()
.
Mockito.doThrow(exception.class).when(an object).method name();
И тогава втората опция:
Mockito.when(an object.method name()).thenThrow(exception.class);
Малко очаквано, нали?
Е, виждате ли, вече започвате да разбирате. Нека го поправим с пример:
@ExtendWith(MockitoExtension.class)
class DoThrowTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.when(mockList.size() ).thenThrow(IllegalStateException.class);
mockList.size(); //an exception will be thrown here
}
}
Ако трябва да хвърлите конкретен обект на изключение, използвайте конструкцията на формуляра:
Mockito.doThrow(new Exception()).when(an object).method name();
Просто предайте doThrow()
обект на изключение към метода и той ще бъде хвърлен по време на извикването на метода.