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