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.
GO TO FULL VERSION