4.1 Parametry metody

Poprzednie reguły dodane do obiektu makiety dotyczyły metod bez parametrów. A jak stworzyć reguły dla metod z parametrami? Ponadto chciałbym stworzyć reguły, aby dla niektórych wartości parametrów był jeden wynik, a dla innych inny.

Tak też możesz to zrobić. Jeśli chcesz, aby metoda zwracała coś konkretnego z określonym parametrem, regułę można zapisać w następujący sposób:

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

Spójrzmy na przykład, aby lepiej zrozumieć. Niech nasza lista zwróci imię Iwan, gdy zażądamy 10. elementu, a imię Marya, gdy zażądamy 500. elementu. Nie prędzej powiedziane niż zrobione.

@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 Szablony parametrów

I od razu sprytni koledzy zadają mi pytanie: „A co, jeśli metoda wymaga argumentów, ale dla dowolnych wartości musi zwracać ten sam wynik?”. Nie piszmy:

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

Nie, nikt nie każe Ci tak pisać. Jeśli chcesz dodać regułę do symulowanego obiektu, który działa dla metody z dowolnymi argumentami, jest do tego specjalny obiekt:

Mockito.any()

Nasz przykład z tym byłby napisany tak:

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

Jest tu kilka niuansów. Obiekt Mockito.any()ma typ Object, więc istnieją analogi dla parametrów różnych typów:

metoda Typ parametru
1 każdy() Obiekt zawierający wartość null
2 any(NazwaKlasy.klasa) Nazwa klasy
3 dowolnaInt() int
4 dowolna wartość logiczna() logiczna
5 anyDouble() podwójnie
6 dowolnaLista() Lista

Dokładniej, nasz przykład wyglądałby tak:

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

4.3 Metoda doAnswer().

Dotarliśmy do złożonego zachowania metod wirtualnych. Prędzej czy później dojdzie do sytuacji, w której będziesz chciał, aby ta wirtualna metoda miała złożone zachowanie. Np. powinien zwrócić wartości w zależności od parametrów, zamienić napis na wielkie litery.

Jest do tego specjalna metoda - doAnswer(), która przekazuje funkcję, która robi to, czego potrzebujesz:

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

Sprawmy, aby metoda get()klasy Listzwracała kwadrat przekazanego jej argumentu. I napisz następujący 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));
    }
}

Funkcję zdefiniowaliśmy za pomocą obiektu klasy Answer.