web-dev-qa-db-fra.com

Mockito.any () pass Interface avec Generics

est-il possible de passer le type d'une interface avec des génériques?

L'interface:

public interface AsyncCallback<T>

Dans ma méthode de test:

Mockito.any(AsyncCallback.class)

En mettant <ResponseX> derrière ou pour .class n'a pas fonctionné.

136
lrxw

Il y a un moyen sûr: utilisez ArgumentMatchers.any() et qualifiez-le avec le type:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

comme mentionné dans les commentaires de pierrefevrier, avec les nouvelles versions de Mockito,

Matchers.<AsyncCallback<ResponseX>>any()
246
thSoft

En utilisant Java 8, vous pouvez simplement utiliser any() (en supposant une importation statique) sans argument ni paramètre de type en raison de l'inférence de type améliorée. Le compilateur sait maintenant à partir du type cible (le type de l'argument de méthode) que vous voulez réellement dire Matchers.<AsyncCallback<ResponseX>>any(), qui est la solution antérieure à Java 8.

56
herman

J'ai dû adopter le mécanisme suivant pour permettre l'utilisation de génériques:

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

J'espère que ça aide quelqu'un.

14
theINtoy

Afficher le commentaire pierrefevrier en tant que réponse, ce qui pourrait être utile s’il est présenté dans une réponse plutôt que dans des commentaires.

Avec les nouvelles versions de Mockito: (Matchers.<AsyncCallback<ResponseX>>any()

4
sag

Suite à la réponse de thSoft, mettre l'appel qualifié à any () dans la méthode signifiait que je pouvais supprimer la qualification puisque le type de retour permettait l'inférence:

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

Vous pouvez simplement le lancer, en ajoutant des avertissements de suppression si vous le souhaitez:

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

Si Java autorisait les génériques 'génériques'), ils pourraient utiliser une méthode comme celle-ci, ce que vous recherchez.

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