4.1 A módszer paraméterei
A mock objektumhoz hozzáadott korábbi szabályok a paraméterek nélküli metódusokkal foglalkoztak. És hogyan lehet szabályokat létrehozni a paraméterekkel rendelkező metódusokhoz? Sőt, szabályokat szeretnék létrehozni úgy, hogy egyes paraméterértékekhez egy eredmény legyen, másoknak pedig egy másik.
Így te is meg tudod csinálni. Ha azt szeretné, hogy a metódus valami konkrétat adjon vissza egy bizonyos paraméterrel, akkor a szabályt így írhatja fel:
Mockito.doReturn(result).when(an object).method name(parameter);
Vessünk egy példát, hogy jobban megértsük. Listánk a 10. elem kérésekor adja vissza az Iván nevet, az 500. elem kérésekor pedig a Marya nevet. Alig van szó, mint kész.
@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 Paramétersablonok
És a ravasz kollégák azonnal felteszik nekem a kérdést: "Mi van, ha a módszer érveket igényel, de bármilyen érték esetén ugyanazt az eredményt kell visszaadnia?". Ne írjuk:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Nem, senki nem kényszerít rá, hogy ilyeneket írj. Ha olyan álobjektumhoz szeretne hozzáadni egy szabályt, amely bármilyen argumentumú metódushoz működik, akkor ehhez van egy speciális objektum:
Mockito.any()
Példánk így lenne írva:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Van itt néhány árnyalat. Az objektum Mockito.any()
típusa Object
, tehát vannak analógok a különböző típusú paraméterekhez:
Módszer | Paraméter típusa | |
---|---|---|
1 | Bármi() | Objektum, beleértve a nullát |
2 | tetszőleges(Osztálynév.osztály) | osztály név |
3 | anyInt() | int |
4 | anyBoolean() | logikai érték |
5 | anyDouble() | kettős |
6 | anyList() | Lista |
Helyesebben a példánk így nézne ki:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 doAnswer() metódus
Eljutottunk a virtuális módszerek komplex viselkedéséhez. Előbb vagy utóbb lesz olyan helyzet, amikor azt szeretné, hogy ez a virtuális módszer összetett viselkedésű legyen. Például a paraméterektől függően értékeket kell visszaadnia, a karakterláncot nagybetűssé kell alakítania.
Létezik erre egy speciális módszer - doAnswer()
, amely egy olyan függvényt ad át, amelyik megteszi, amire szüksége van:
Mockito.doAnswer(function).when(an object).method name(parameter);
Tegyük meg, hogy az get()
osztály metódus List
adja vissza a neki átadott argumentum négyzetét. És írd meg a következő programot:
@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));
}
}
A függvényt az Answer osztály objektumával határoztuk meg.
GO TO FULL VERSION