4.1 Methodeparameters
De vorige regels die aan het mock-object waren toegevoegd, hadden betrekking op methoden zonder parameters. En hoe maak je regels voor methodes met parameters? Bovendien zou ik regels willen maken zodat er voor sommige parameterwaarden één resultaat is en voor andere - een ander.
Zo kan jij het ook doen. Als je wilt dat de methode iets specifieks retourneert met een bepaalde parameter, dan kan de regel als volgt worden geschreven:
Mockito.doReturn(result).when(an object).method name(parameter);
Laten we een voorbeeld bekijken om het beter te begrijpen. Laat onze lijst de naam Ivan retourneren bij het aanvragen van het 10e element, en de naam Marya bij het aanvragen van het 500e. Zo gezegd zo gedaan.
@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 Parametersjablonen
En sluwe collega's zullen me meteen de vraag stellen: "Wat als de methode argumenten vereist, maar voor alle waarden hetzelfde resultaat moet opleveren?". Laten we niet schrijven:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Nee, niemand dwingt je om zo te schrijven. Als je een regel wilt toevoegen aan een mock-object die werkt voor een methode met willekeurige argumenten, dan is daar een speciaal object voor:
Mockito.any()
Ons voorbeeld ermee zou als volgt worden geschreven:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Er zijn hier een paar nuances. Het object Mockito.any()
heeft type Object
, dus er zijn analogen voor parameters van verschillende typen:
Methode | Parametertype | |
---|---|---|
1 | elk() | Object inclusief nul |
2 | elke(ClassName.class) | naam van de klasse |
3 | elkeInt() | int |
4 | elke Boolean() | booleaans |
5 | elkeDubbel() | dubbele |
6 | elkeLijst() | Lijst |
Correcter, ons voorbeeld zou er als volgt uitzien:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer()-methode
We kwamen bij het complexe gedrag van virtuele methoden. Vroeg of laat komt er een situatie waarin je wilt dat deze virtuele methode complex gedrag vertoont. Het zou bijvoorbeeld waarden moeten retourneren, afhankelijk van de parameters, de tekenreeks omzetten in hoofdletters.
Hiervoor is een speciale methode - doAnswer()
, die een functie wordt doorgegeven die doet wat je nodig hebt:
Mockito.doAnswer(function).when(an object).method name(parameter);
Laten we ervoor zorgen dat de get()
class -methode List
het kwadraat van het argument teruggeeft dat eraan is doorgegeven. En schrijf het volgende programma:
@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));
}
}
We hebben de functie gedefinieerd met behulp van een object van de klasse Answer.