Mockito isA(Classe<T> clazz) Comment faire pour résoudre le type de sécurité?
dans mon test, j'ai la ligne suivante:
when(client.runTask(anyString(), anyString(), isA(Iterable.class)).thenReturn(...)
isA(Iterable.class)
produit l'avertissement qu'il a besoin de unchecked conversion pour se conformer à Iterable<Integer>
. Quelle est la syntaxe pour qui?
isA(Iterable<Integer>.class)
isA((Iterable<Integer>)Iterable.class
ne fonctionnent pas.
Des suggestions?
- double possible de Mockito.any() passer de l'Interface avec les Génériques
Vous devez vous connecter pour publier un commentaire.
Mockito/Hamcrest et classes génériques
Oui, c'est un problème général avec Mockito/Hamcrest. Généralement à l'aide de
isA()
avec les classes génériques produit un avertissement.Il y a predifinis Mockito de rapprochement pour la plupart des classes génériques: anyList(),
anyMap()
,anySet()
etanyCollection()
.Suggestions:
anyIterable() dans Mockito 2.1.0
Mockito 2.1.0 ajouté une nouvelle anyIterable() méthode pour la mise en correspondance Iterables:
Ignorer dans Eclipse
Si vous voulez juste pour se débarrasser de l'avertissement dans Eclipse. Option existe depuis Eclipse Indigo:
Quick Fix avec @SuppressWarnings
Je vous suggère de le faire si vous avez le problème qu'une seule fois. Personnellement, je ne me souviens pas d'avoir jamais un
isA(Iterable.class)
.Comme Daniel Pryden dit, vous pouvez limiter la
@SuppressWarnings
à une variable locale ou une méthode d'aide.Utiliser un générique isA() matcher avec TypeToken
Cela résout le problème pour de bon. Mais il a deux inconvénients:
TypeToken
classe. Ici j'ai utilisé la TypeToken classe de Goyave. Il y a aussi unTypeToken
classe dans Gson et unGenericType
de JAX-RS.En utilisant le générique comparateur de:
Générique comparateur de classe:
T any(T)
méthode. Dans JMockit, par exemple, on peut écrire la suite, tout en évitant un "unchecked" avertissement:Iterable<Integer> col = null; client.runTask(anyString, anyString, withAny(col));
.Voici ce que je fais:
Vous pouvez ajouter
@SuppressWarnings("unchecked")
- dessus de l'instruction. Pas d'autre moyen, mais si cela vous dérange, vous pouvez déplacer le casting d'une méthode d'aide.Il n'existe aucun moyen pour ce faire. Pour simplifier, vous ne pouvez pas initialiser cette variable sans avertissement :
Une solution pourrait être d'utiliser le pseudo-typedef antipattern,
vous permet de créer et d'utiliser un
IntegerIterable
interfacepuis
ne plus produire d'avertissement. Mais vous devrez étendre la classe la mise en œuvre de
Iterable
de les laisser implémenteIntegerIterable
🙂 Par exemple :Mmm savoureux...
Donc, je vais vous suggérons de considérer à juste papier sur les fissures en ajoutant à votre méthode :