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.