4.1 Parametrii metodei
Regulile anterioare adăugate obiectului simulat s-au ocupat de metode fără parametri. Și cum să creați reguli pentru metodele cu parametri? Mai mult, aș dori să creez reguli, astfel încât pentru unele valori ale parametrilor să existe un rezultat, iar pentru altele - altul.
Așa poți să faci și tu. Dacă doriți ca metoda să returneze ceva specific cu un anumit parametru, atunci regula poate fi scrisă astfel:
Mockito.doReturn(result).when(an object).method name(parameter);
Să aruncăm o privire la un exemplu pentru a înțelege mai bine. Lăsați Lista noastră să returneze numele Ivan atunci când solicitați al 10-lea element și numele Marya când solicitați al 500-lea. Făcut repede şi foarte bine.
@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 Șabloane de parametri
Și imediat colegii vicleni îmi vor pune întrebarea: „Dar dacă metoda necesită argumente, dar pentru orice valoare trebuie să returneze același rezultat?”. Sa nu scriem:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
Nu, nimeni nu te obligă să scrii așa. Dacă doriți să adăugați o regulă la un obiect simulat care funcționează pentru o metodă cu orice argument, atunci există un obiect special pentru aceasta:
Mockito.any()
Exemplul nostru cu el ar fi scris astfel:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Există câteva nuanțe aici. Obiectul Mockito.any()
are tipul Object
, deci există analogi pentru parametri de diferite tipuri:
Metodă | Tipul de parametru | |
---|---|---|
1 | orice() | Obiect inclusiv nul |
2 | orice(ClassName.class) | numele clasei |
3 | anyInt() | int |
4 | anyBoolean() | boolean |
5 | anyDouble() | dubla |
6 | anyList() | Listă |
Mai corect, exemplul nostru ar arăta astfel:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 metoda doAnswer().
Am ajuns la comportamentul complex al metodelor virtuale. Mai devreme sau mai târziu va exista o situație în care doriți ca această metodă virtuală să aibă un comportament complex. De exemplu, ar trebui să returneze valori în funcție de parametri, să convertească șirul în majuscule.
Există o metodă specială pentru aceasta - doAnswer()
, căreia i se transmite o funcție care face ceea ce aveți nevoie:
Mockito.doAnswer(function).when(an object).method name(parameter);
Să facem ca metoda get()
clasei List
să returneze pătratul argumentului transmis. Și scrieți următorul 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));
}
}
Am definit funcția folosind un obiect din clasa Answer.