Mockito: List Matchers avec des génériques

167

Mockito propose:

when(mock.process(Matchers.any(List.class)));

Comment éviter l'avertissement si processprend un à la List<Bar>place?

Philippe Blayo
la source

Réponses:

279

Pour Java 8 et supérieur, c'est simple:

when(mock.process(Matchers.anyList()));

Pour Java 7 et versions antérieures, le compilateur a besoin d'un peu d'aide. Utilisez anyListOf(Class<T> clazz):

when(mock.process(Matchers.anyListOf(Bar.class)));
artbristol
la source
16
Remarque: ceci est obsolète dans Mockito 2. * et sera supprimé dans Mockito 3. Déconseillé car le compilateur Java 8 peut maintenant déduire le type.
Kip
@artbristol savez-vous si avec anySet () devrait fonctionner comme anyList ()? Je suis dans Java 8 et un avertissement est lancé dans Eclipse IDE
Fernando Fradegrada
1
Mieux vaut utiliser anyListOf. Même si cela anyListfonctionne, il émet un avertissement.
balki
3
anyListOfest obsolète, il est donc préférable de NE PAS l'utiliser. L'exemple pour Java 8 ne fonctionne pas en cas de surcharge de méthode, par exemple si vous avez une méthode acceptant 2 listes différentes: List<DBEntity>et List<DTO>j'ai résolu ce problème en utilisant ArgumentMatchersgénérique:when(adapter.adapt(ArgumentMatchers.<DTO>anyList())).thenCallRealMethod();
edufinn
14

En plus de ce qui anyListOfprécède, vous pouvez toujours spécifier des génériques explicitement en utilisant cette syntaxe:

when(mock.process(Matchers.<List<Bar>>any(List.class)));

Java 8 permet récemment l'inférence de type basée sur des paramètres, donc si vous utilisez Java 8, cela peut également fonctionner:

when(mock.process(Matchers.any()));

Souvenez-vous que ni any()ni anyList()n'appliquera aucune vérification, y compris les vérifications de type ou nulles. Dans Mockito 2.x, a any(Foo.class)été changé pour signifier "any instanceofFoo", mais any()signifie toujours "any value including null".

REMARQUE: ce qui précède est passé à ArgumentMatchers dans les versions plus récentes de Mockito, pour éviter une collision de nom avec org.hamcrest.Matchers. Les anciennes versions de Mockito devront continuer à utiliser org.mockito.Matcherscomme ci-dessus.

Jeff Bowman
la source
4
Matchers.any()c'est très pratique!
MBach
Matchers est désormais obsolète, voici les informations de mockito "Utilisez ArgumentMatchers. Cette classe est désormais obsolète afin d'éviter un conflit de nom avec la classe Hamcrest org.hamcrest.Matchers. Cette classe sera probablement supprimée dans la version 3.0." static.javadoc.io/org.mockito/mockito-core/2.7.21/org/mockito/…
oddmeter
@oddmeter Modifications apportées.
Jeff Bowman
5

Avant Java 8 (versions 7 ou 6), j'utilise la nouvelle méthode ArgumentMatchers.anyList:

import static org.mockito.Mockito.*;
import org.mockito.ArgumentMatchers;

verify(mock, atLeastOnce()).process(ArgumentMatchers.<Bar>anyList());
Miguel R. Santaella
la source