CodeGym/Java Course/Modulo 3/Chiamare metodi fittizi con parametri

Chiamare metodi fittizi con parametri

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
  • Popolari
  • Nuovi
  • Vecchi
Devi avere effettuato l'accesso per lasciare un commento
Questa pagina non ha ancora commenti