4.1 Parametri del metodo
Le regole precedenti aggiunte all'oggetto fittizio riguardavano metodi senza parametri. E come creare regole per metodi con parametri? Inoltre, vorrei creare regole in modo che per alcuni valori di parametro ci sia un risultato e per altri un altro.
È così che puoi farlo anche tu. Se vuoi che il metodo restituisca qualcosa di specifico con un certo parametro, allora la regola può essere scritta così:
Mockito.doReturn(result).when(an object).method name(parameter);
Facciamo un esempio per capire meglio. Lascia che la nostra Lista restituisca il nome Ivan quando richiedi il 10° elemento, e il nome Marya quando richiedi il 500°. Detto fatto.
@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 Modelli di parametri
E subito i colleghi furbi mi faranno la domanda: "E se il metodo richiede argomenti, ma per qualsiasi valore deve restituire lo stesso risultato?". Non scriviamo:
Mockito.doReturn("Ivan").when(mockList).get(1);
Mockito.doReturn("Ivan").when(mockList).get(2);
Mockito.doReturn("Ivan").when(mockList).get(99);
No, nessuno ti obbliga a scrivere così. Se vuoi aggiungere una regola a un oggetto fittizio che funzioni per un metodo con qualsiasi argomento, allora c'è un oggetto speciale per questo:
Mockito.any()
Il nostro esempio con esso sarebbe scritto in questo modo:
Mockito.doReturn("Ivan").when(mockList).get(any(int.class));
Ci sono un paio di sfumature qui. L'oggetto Mockito.any()
ha type Object
, quindi ci sono analoghi per parametri di diverso tipo:
Metodo | Tipo di parametro | |
---|---|---|
1 | Qualunque() | Oggetto che include null |
2 | qualsiasi(NomeClasse.classe) | nome della classe |
3 | qualsiasiInt() | int |
4 | qualsiasiBoolean() | booleano |
5 | qualsiasiDoppio() | Doppio |
6 | qualsiasiLista() | Elenco |
Più correttamente, il nostro esempio sarebbe simile a questo:
Mockito.doReturn("Ivan").when(mockList).get(anyInt());
4.3 Metodo doAnswer()
Siamo arrivati al comportamento complesso dei metodi virtuali. Prima o poi ci sarà una situazione in cui vuoi che questo metodo virtuale abbia un comportamento complesso. Ad esempio, dovrebbe restituire valori a seconda dei parametri, convertire la stringa in maiuscolo.
C'è un metodo speciale per questo - doAnswer()
, a cui viene passata una funzione che fa ciò di cui hai bisogno:
Mockito.doAnswer(function).when(an object).method name(parameter);
Facciamo in modo che il metodo get()
della classe List
restituisca il quadrato dell'argomento che gli è stato passato. E scrivi il seguente programma:
@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));
}
}
Abbiamo definito la funzione utilizzando un oggetto della classe Answer.