Considérez ce code:
public class DummyClass {
public List<? extends Number> dummyMethod() {
return new ArrayList<Integer>();
}
}
public class DummyClassTest {
public void testMockitoWithGenerics() {
DummyClass dummyClass = Mockito.mock(DummyClass.class);
List<? extends Number> someList = new ArrayList<Integer>();
Mockito.when(dummyClass.dummyMethod()).thenReturn(someList); //Compiler complains about this
}
}
Le compilateur se plaint de la ligne qui tente de stuber le comportement dummyMethod()
. Des pointeurs sur la façon dont on procède aux méthodes de stubbing qui retournent un type avec des jokers bornés?
java
unit-testing
generics
mockito
bounded-wildcard
Shikhar Mishra
la source
la source
Réponses:
Vous pouvez également utiliser la méthode sûre non-type doReturn à cet effet,
comme indiqué sur le groupe Google de Mockito.
Bien que ce soit plus simple que
thenAnswer
, notez à nouveau que ce n'est pas un type sûr. Si vous êtes préoccupé par la sécurité des types, la réponse de Millhouse est correcte.Détails supplémentaires
Pour être clair, voici l'erreur du compilateur observée,
Je crois que le compilateur a attribué le premier type générique pendant l'
when
appel et ne peut pas confirmer que le deuxième type générique dans l'thenReturn
appel est le même.Il semble
thenAnswer
ne pas rencontrer ce problème car il accepte un type générique alors qu'ilthenReturn
prend un type non générique, qui doit être capturé. De Mockito's OngoingStubbing ,la source
Je suppose que vous voulez pouvoir charger
someList
avec certaines valeurs connues; voici une approche qui utiliseAnswer<T>
avec une méthode d'assistance basée sur un modèle pour que tout soit sûr de type:la source
J'ai frappé la même chose hier. Les deux réponses de @ nondescript1 et @millhouse m'ont aidé à trouver une solution de contournement. J'ai à peu près utilisé le même code que @millhouse, sauf que je l'ai rendu légèrement plus générique, car mon erreur n'était pas causée par un
java.util.List
, mais lecom.google.common.base.Optional
. Ma petite méthode d'aide permet donc tout typeT
et pas seulementList<T>
:Avec cette méthode d'aide, vous pouvez écrire:
Cela compile très bien et fait la même chose que la
thenReturn(...)
méthode.Est-ce que quelqu'un sait si l'erreur émise par le compilateur Java est un bogue du compilateur ou si le code est vraiment incorrect?
la source
Mockito.when(dummyClass.dummyMethod()).thenAnswer(x -> someList)
Je tourne le commentaire de fikovnik en réponse ici pour lui donner plus de visibilité car je pense que c'est la solution la plus élégante utilisant Java 8+.
La documentation Mockito recommande d'utiliser
doReturn()
(comme suggéré dans la réponse acceptée) qu'en dernier recours.Au lieu de cela, pour contourner l'erreur du compilateur décrite dans la question, l'
when()
approche Mockito recommandée peut être utilisée avecthenAnswer()
et un lambda (au lieu d'une méthode d'assistance):la source
Bien que la méthode utilitaire proposée par Marek Radonsky fonctionne, il existe également une autre option qui ne nécessite même pas l'expression lambda (à mon humble avis étrange) suggérée par fikovnik:
Comme le montre cette réponse à une question similaire, vous pouvez également utiliser ce qui suit:
la source