231 votes

Mockito.any() pass Interface avec les génériques

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)

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

406voto

thSoft Points 5513

Il existe une méthode sûre : utiliser ArgumentMatchers.any() et le qualifier avec le type :

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

5 votes

Je confirme que cette réponse fonctionne et supprime correctement l'avertissement.

1 votes

Ce n'est pas vraiment plus sûr puisque la méthode actuelle ne peut être appelée qu'avec l'argument correctement typé de toute façon. C'était juste nécessaire pour satisfaire le compilateur pré-Java8 qui n'avait pas ce type d'inférence de type.

0 votes

J'ai utilisé quelque chose comme ceci ResponseEntity<List<Map<String, Object>>> responseEntity = Matchers.<ResponseEntity<List<Map<String, Object>>>> any() ; Et cela renvoie toujours null

79voto

herman Points 1358

Avec Java 8, vous pouvez simplement utiliser any() (en supposant une importation statique) sans argument ou 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 la méthode), que vous voulez réellement dire Matchers.<AsyncCallback<ResponseX>>any() qui est la solution pré-Java 8.

0 votes

N'est-ce pas ? any() match AsyncCallback<AnyOtherType> également ?

0 votes

@MatthewRead Using AsyncCallback<AnyOtherType> ne devrait même pas compiler si le type d'argument est 'AsyncCallback<ResponseX>'.

1 votes

Je m'interroge sur une situation où le type d'argument est également générique, mais où vous ne voulez le simuler que pour un seul type concret (ou le simuler pour plusieurs types de différentes manières). Étant donné when(x.y(any())).thenAnswer(...) par exemple, où y es public <T> T y(AsyncCallback<T> arg) . Peut-être serait-il préférable de vérifier le type dans la réponse, si c'est ce qui est nécessaire ?

20voto

theINtoy Points 428

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

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

J'espère que cela aidera quelqu'un.

4 votes

Voir ma réponse : ce n'est plus nécessaire avec Java 8.

5voto

sag Points 2300

Affichage du commentaire de pierrefevrier en tant que réponse, ce qui pourrait être utile s'il était présenté dans une réponse au lieu des commentaires.

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

1 votes

J'ai ajouté son commentaire à la réponse originale

3voto

user379806 Points 116

Suite à la réponse de ThSoft, le fait de placer l'appel qualifié à any() dans la méthode m'a permis de supprimer la qualification puisque le type de retour permettait l'inférence :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X