Mockito: List Matchers avec des génériques


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)));

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.


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());
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.