CodeGym /Java tanfolyam / /Mock metódusok meghívása paraméterekkel

Mock metódusok meghívása paraméterekkel

Szint , Lecke
Elérhető

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 Listadja 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.

Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION