4.1 Metodeparametre

De tidligere regler føjet til mock-objektet handlede om metoder uden parametre. Og hvordan opretter man regler for metoder med parametre? Desuden vil jeg gerne oprette regler, så der for nogle parameterværdier er ét resultat, og for andre - et andet.

Sådan kan du også gøre det. Hvis du vil have metoden til at returnere noget specifikt med en bestemt parameter, så kan reglen skrives sådan:

Mockito.doReturn(result).when(an object).method name(parameter);

Lad os tage et kig på et eksempel for at forstå det bedre. Lad vores liste returnere navnet Ivan, når du anmoder om det 10. element, og navnet Marya, når du anmoder om det 500. Ikke før sagt end gjort.

@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 Parameterskabeloner

Og straks vil snedige kolleger stille mig spørgsmålet: "Hvad hvis metoden kræver argumenter, men for enhver værdi skal den returnere det samme resultat?". Lad os ikke skrive:

Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);

Nej, ingen tvinger dig til at skrive sådan. Hvis du vil tilføje en regel til et mock-objekt, der virker for en metode med alle argumenter, så er der et specielt objekt til dette:

Mockito.any()

Vores eksempel med det ville være skrevet sådan:

Mockito.doReturn("Ivan").when(mockList).get(any(int.class));

Der er et par nuancer her. Objektet Mockito.any()har type Object, så der er analoger til parametre af forskellige typer:

Metode Parameter type
1 nogen() Objekt inklusive null
2 any(ClassName.class) klassenavn
3 anyInt() int
4 anyBoolean() boolesk
5 anyDouble() dobbelt
6 anyList() Liste

Mere korrekt ville vores eksempel se sådan ud:

Mockito.doReturn("Ivan").when(mockList).get(anyInt());

4.3 doAnswer() metode

Vi kom til den komplekse adfærd af virtuelle metoder. Før eller siden vil der opstå en situation, hvor du ønsker, at denne virtuelle metode skal have kompleks adfærd. For eksempel skal det returnere værdier afhængigt af parametrene, konvertere strengen til store bogstaver.

Der er en speciel metode til dette - doAnswer(), som er bestået en funktion, der gør det du har brug for:

Mockito.doAnswer(function).when(an object).method name(parameter);

Lad os få klassemetoden get()til Listat returnere kvadratet af argumentet, der er sendt til den. Og skriv følgende program:

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

Vi definerede funktionen ved hjælp af et objekt af klassen Answer.