4.1 Metodeparametere

De tidligere reglene som ble lagt til mock-objektet handlet om metoder uten parametere. Og hvordan lage regler for metoder med parametere? Dessuten vil jeg lage regler slik at for noen parameterverdier er det ett resultat, og for andre - et annet.

Slik kan du også gjøre det. Hvis du vil at metoden skal returnere noe spesifikt med en bestemt parameter, kan regelen skrives slik:

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

La oss ta en titt på et eksempel for å forstå bedre. La listen vår returnere navnet Ivan når du ber om det 10. elementet, og navnet Marya når du ber om det 500. Ikke før sagt enn 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 Parametermaler

Og umiddelbart vil utspekulerte kolleger stille meg spørsmålet: "Hva om metoden krever argumenter, men for alle verdier må den returnere det samme resultatet?". La oss ikke skrive:

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

Nei, ingen tvinger deg til å skrive slik. Hvis du vil legge til en regel til et falskt objekt som fungerer for en metode med noen argumenter, så er det et spesielt objekt for dette:

Mockito.any()

Vårt eksempel med det vil bli skrevet slik:

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

Det er et par nyanser her. Objektet Mockito.any()har type Object, så det er analoger for parametere av forskjellige typer:

Metode Parametertype
1 noen() Objekt inkludert null
2 any(ClassName.class) klassenavn
3 anyInt() int
4 anyBoolean() boolsk
5 anyDouble() dobbelt
6 anyList() Liste

Mer korrekt vil vårt eksempel se slik ut:

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

4.3 doAnswer()-metoden

Vi kom til den komplekse oppførselen til virtuelle metoder. Før eller siden vil det oppstå en situasjon når du vil at denne virtuelle metoden skal ha kompleks oppførsel. For eksempel skal den returnere verdier avhengig av parameterne, konvertere strengen til store bokstaver.

Det er en spesiell metode for dette - doAnswer(), som sendes en funksjon som gjør det du trenger:

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

La oss få klassemetoden get()til Listå returnere kvadratet av argumentet som ble 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 definerte funksjonen ved å bruke et objekt av Answer-klassen.