4.1 Metodparametrar

De tidigare reglerna som lades till skenobjektet handlade om metoder utan parametrar. Och hur skapar man regler för metoder med parametrar? Dessutom skulle jag vilja skapa regler så att det för vissa parametervärden finns ett resultat och för andra - ett annat.

Det är så du kan göra det också. Om du vill att metoden ska returnera något specifikt med en viss parameter, kan regeln skrivas så här:

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

Låt oss ta en titt på ett exempel för att förstå bättre. Låt vår lista returnera namnet Ivan när du begär det 10:e elementet, och namnet Marya när du begär det 500:e. Inte tidigare sagt än 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 Parametermallar

Och omedelbart kommer listiga kollegor att ställa mig frågan: "Vad händer om metoden kräver argument, men för alla värden måste den returnera samma resultat?". Låt oss inte skriva:

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

Nej, ingen tvingar dig att skriva så. Om du vill lägga till en regel till ett låtsasobjekt som fungerar för en metod med några argument, så finns det ett speciellt objekt för detta:

Mockito.any()

Vårt exempel med det skulle skrivas så här:

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

Det finns ett par nyanser här. Objektet Mockito.any()har typ Object, så det finns analoger för parametrar av olika typer:

Metod Parametertyp
1 några() Objekt inklusive null
2 any(ClassName.class) klassnamn
3 anyInt() int
4 anyBoolean() booleskt
5 anyDouble() dubbel
6 anyList() Lista

Mer korrekt skulle vårt exempel se ut så här:

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

4.3 doAnswer()-metoden

Vi kom till det komplexa beteendet hos virtuella metoder. Förr eller senare kommer det att uppstå en situation när du vill att den här virtuella metoden ska ha ett komplext beteende. Till exempel bör den returnera värden beroende på parametrarna, konvertera strängen till versaler.

Det finns en speciell metod för detta - , doAnswer()som får en funktion som gör vad du behöver:

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

Låt oss få get()klassmetoden Listatt returnera kvadraten på argumentet som skickas till den. Och skriv följande 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 definierade funktionen med ett objekt av klassen Answer.