Existe-t-il un moyen de capturer une liste de types spécifiques à l'aide de mockitos ArgumentCaptore. Cela ne fonctionne pas:
ArgumentCaptor<ArrayList<SomeType>> argument = ArgumentCaptor.forClass(ArrayList.class);
java
unit-testing
junit
mockito
Andreas Köberle
la source
la source
ArrayList
). Vous pouvez toujours utiliser l'List
interface, et si vous voulez représenter le fait que c'est covariant, alors vous pouvez utiliserextends
:ArgumentCaptor<? extends List<SomeType>>
Réponses:
Le problème des génériques imbriqués peut être évité avec l' annotation @Captor :
la source
MockitoAnnotations.initMocks(this)
dans la@Before
méthode plutôt que d'utiliser un coureur qui exclut la possibilité d'utiliser un autre coureur. Cependant, +1, merci d'avoir souligné l'annotation.Oui, c'est un problème générique général, pas spécifique aux mockito.
Il n'y a pas d'objet de classe pour
ArrayList<SomeType>
, et donc vous ne pouvez pas passer un tel objet en toute sécurité à une méthode nécessitant unClass<ArrayList<SomeType>>
.Vous pouvez convertir l'objet au bon type:
Cela donnera des avertissements sur les conversions dangereuses, et bien sûr, votre ArgumentCaptor ne peut pas vraiment faire la différence entre
ArrayList<SomeType>
etArrayList<AnotherType>
sans peut-être inspecter les éléments.(Comme mentionné dans l'autre réponse, bien qu'il s'agisse d'un problème générique général, il existe une solution spécifique à Mockito pour le problème de sécurité de type avec l'
@Captor
annotation. Elle ne peut toujours pas distinguer entre unArrayList<SomeType>
et unArrayList<OtherType>
.)Éditer:
Jetez également un œil au commentaire de tenshi . Vous pouvez changer le code original de Paŭlo Ebermann en ceci (beaucoup plus simple)
la source
ArgumentCaptor<List<SimeType>> argument = ArgumentCaptor.forClass((Class) List.class);
@SuppressWarnings("unchecked")
annotation au-dessus de la ligne de définition du capteur d'arguments. En outre, la diffusion versClass
est redondante.Class
n'est pas redondant dans mes tests.Si vous n'avez pas peur de l'ancienne sémantique de style java (générique non sécurisé de type), cela fonctionne également et est assez simple:
la source
la source
Sur la base des commentaires de @ tenshi et @ pkalinow (également bravo à @rogerdpack), ce qui suit est une solution simple pour créer un capteur d'argument de liste qui désactive également l' avertissement "utilise des opérations non contrôlées ou dangereuses" :
Exemple complet ici et génération de CI et test de passage correspondants ici .
Notre équipe l'utilise depuis un certain temps dans nos tests unitaires et cela semble être la solution la plus simple pour nous.
la source
Pour une version antérieure de junit, vous pouvez le faire
la source
J'ai eu le même problème avec l'activité de test dans mon application Android. J'ai utilisé
ActivityInstrumentationTestCase2
et jeMockitoAnnotations.initMocks(this);
n'ai pas travaillé. J'ai résolu ce problème avec une autre classe avec respectivement champ. Par exemple:Ensuite, dans la méthode de test d'activité:
la source
Il y a un problème ouvert dans le GitHub de Mockito à propos de ce problème exact.
J'ai trouvé une solution de contournement simple qui ne vous oblige pas à utiliser des annotations dans vos tests:
Ce qui se passe ici, c'est que nous créons une nouvelle classe avec l'
@Captor
annotation et y injectons le capteur. Ensuite, nous extrayons simplement le capteur et le renvoyons de notre méthode statique.Dans votre test, vous pouvez l'utiliser comme ceci:
Ou avec une syntaxe qui ressemble à celle de Jackson
TypeReference
:Cela fonctionne, car Mockito n'a en fait besoin d'aucune information de type (contrairement aux sérialiseurs, par exemple).
la source