Mockito.any () passa l'interfaccia con Generics


170

è possibile passare il tipo di interfaccia con generici?

L'interfaccia:

public interface AsyncCallback<T>

Nel mio metodo di prova:

Mockito.any(AsyncCallback.class)

Mettere <ResponseX>dietro o per non .classfunzionare.

Risposte:


306

Esiste un modo sicuro per ArgumentMatchers.any()il tipo: usalo e qualificalo con il tipo:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
Confermo che questa risposta funziona e sopprime correttamente l'avviso.
kevinarpe,

1
Questo non è molto più sicuro poiché il metodo reale può essere chiamato comunque solo con l'argomento digitato correttamente. Era solo necessario soddisfare il compilatore pre-java8 che mancava di questo tipo di inferenza di tipo.
herman,

Ho usato qualcosa come questo ResponseEntity <Elenco <Mappa <Stringa, Oggetto >>> responseEntity = Matchers. <ResponseEntity <Elenco <Mappa <Stringa, Oggetto >>>> any (); E restituisce sempre null
Arun,

6
Con le nuove versioni di Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier il

15
Matchersè in realtà deprecato, ma ArgumentMatchersha funzionato.
Guijob,

67

Usando Java 8, puoi semplicemente usare any()(assumendo l'importazione statica) senza argomento o parametro di tipo a causa dell'inferenza di tipo avanzata. Il compilatore ora sa dal tipo di destinazione (il tipo dell'argomento del metodo) che intendi effettivamente Matchers.<AsyncCallback<ResponseX>>any(), che è la soluzione pre-Java 8.


Non any()corrisponderebbe AsyncCallback<AnyOtherType>anche?
Matteo Leggi il

@MatthewRead Using AsyncCallback<AnyOtherType>non dovrebbe nemmeno essere compilato se il tipo di argomento è 'AsyncCallback <ResponseX>'.
herman,

1
Mi chiedo una situazione in cui anche il tipo di argomento è generico, ma vuoi deriderlo solo per un tipo concreto (o deriderlo per più tipi in modi diversi). Dato when(x.y(any())).thenAnswer(...)ad esempio, dove si ytrova public <T> T y(AsyncCallback<T> arg). Forse sarebbe meglio controllare il tipo nella risposta, se è quello che serve?
Matteo Leggi il

2
@MatthewRead A causa della cancellazione, il tipo effettivo non può essere verificato in fase di esecuzione da Mockito. Quindi non puoi nemmeno usarlo isA(). Se l'oggetto contiene un Classoggetto corrispondente al tipo e l'interfaccia lo espone, immagino che tu possa verificarlo in un matcher personalizzato. O per esempio in caso di a Collectionpotresti controllare il tipo di elementi.
herman,

1
Matchersè stato sostituito da ArgumentMatchersin Mockito v2
bheussler il

15

Ho dovuto adottare il seguente meccanismo per consentire i generici:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Spero che questo aiuti qualcuno.


3
Vedi la mia risposta: questo non è più necessario con Java 8.
herman

5

Pubblicare un commento pierrefevrier come risposta che potrebbe essere utile se presente in una risposta anziché in commenti.

Con le nuove versioni di Mockito: (Matchers.<AsyncCallback<ResponseX>>any()


1
ho aggiunto il suo commento alla risposta originale
Joergi,

2

In seguito alla risposta di thSoft mettendo la chiamata qualificata a any () nel metodo, ho potuto rimuovere la qualifica poiché il tipo di ritorno ha permesso l'inferenza:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

Puoi semplicemente lanciarlo, aggiungendo avvisi di soppressione se ti piace:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

Se Java consentisse generici "generici", potrebbero avere un metodo come questo, che è quello che stai cercando

private static <T, E> T<E> mock(Class<T<E>> clazz)

Quando ho provato questo, ho ricevuto un errore nel mio test:You cannot use argument matchers outside of verification or stubbing.
kevinarpe

Non è una buona idea usare @SuppressWarnings: pre-java 8, se avessi intenzione di assegnarlo a una variabile separata, potresti semplicemente usare any()come nella risposta di INtoy. Ora con Java 8, any()può essere utilizzato in linea senza la necessità di un compito separato.
herman,

@kevinarpe se si dispone di più matcher matcher, è necessario chiamarli nell'ordine specificato dal linguaggio Java.
TWiStErRob

0

Ho avuto un problema simile usando Spring Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Qui, devi usare la qualifica, b / c Il metodo findAll può assumere più tipi, come Sorte Iterable. Mockito.any(Example.class)Ovviamente puoi anche usarlo con l'avviso di sicurezza tipo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.