4.1 Параметри на метода
Предишните правила, добавени към макетния обект, се занимаваха с методи без параметри. И How да създадете правила за методи с параметри? Освен това бих искал да създам правила, така че за някои стойности на параметри да има един резултат, а за други - друг.
Ето How можете да го направите и вие. Ако искате методът да върне нещо конкретно с определен параметър, тогава правилото може да бъде написано така:
Mockito.doReturn(result).when(an object).method name(parameter);
Нека да разгледаме един пример, за да разберем по-добре. Нека нашият Списък върне името Ivan, когато иска 10-ия елемент, и името Мария, когато иска 500-ия. Казано, сторено.
@ExtendWith(MockitoExtension.class)
class ParamsTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
//adding the first rule
Mockito.doReturn("Ivan").when(mockList).get(10);
//adding a second rule
Mockito.doReturn("Maria").when(mockList).get(500);
assertEquals("Ivan", mockList.get(10));
assertEquals("Maria", mockList.get(500));
}
}
4.2 Шаблони на параметри
И веднага хитрите колеги ще ми зададат въпроса: „Ами ако методът изисква аргументи, но за всяHowви стойности трябва да върне същия резултат?“ Да не пишем:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Не, никой не те кара да пишеш така. Ако искате да добавите правило към макет обект, който работи за метод с всяHowви аргументи, тогава има специален обект за това:
Mockito.any()
Нашият пример с него ще бъде написан така:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Тук има няколко нюанса. Обектът Mockito.any()
има тип Object
, така че има аналози за параметри от различни типове:
Метод | Тип параметър | |
---|---|---|
1 | всяHowви() | Обект, включително null |
2 | произволен (Име на клас.клас) | име на клас |
3 | anyInt() | вътр |
4 | anyBoolean() | булево |
5 | anyDouble() | двойно |
6 | anyList() | списък |
По-правилно нашият пример би изглеждал така:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 метод doAnswer().
Стигнахме до сложното поведение на виртуалните методи. Рано or късно ще има ситуация, когато искате този виртуален метод да има сложно поведение. Например, трябва да върне стойности в зависимост от параметрите, да преобразува низа в главни букви.
Има специален метод за това - doAnswer()
, на който се предава функция, която прави това, от което се нуждаете:
Mockito.doAnswer(function).when(an object).method name(parameter);
Нека накараме метода get()
на класа List
да връща квадрата на подаден му аргумент. И напишете следната програма:
@ExtendWith(MockitoExtension.class)
class DoAnswerTest {
@Mock
List mockList;
@Test
public void whenMockAnnotation() {
Mockito.doAnswer(invocation -> {
int parameter = invocation.getArgument(0);
return parameter * parameter;
}).when(mockList).get(anyInt());
assertEquals(100, mockList.get(10));
assertEquals(25, mockList.get(5));
}
}
Дефинирахме функцията с помощта на обект от класа Answer.