CodeGym /Corsi /All lectures for IT purposes /Chiamare metodi fittizi con parametri

Chiamare metodi fittizi con parametri

All lectures for IT purposes
Livello 1, Lezione 325
Disponibile

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

Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION