Mockito ClassCastException
La méthode que je veux tester a une boucle avec la logique de chaque élément dans bList:
class A {
void someMethod(){
for(B b: bList){
//some logic for b
}
}
}
J'obtiens une exception lors de l'exécution de test suivant:
@RunWith(MockitoJUnitRunner.class)
class ATest {
@Mock
private B b;
@Mock
private Map<Int, List<B>> bMap;
@Mock(answer = Answers.RETURNS_DEEP_STUBS)
private List<B> bList;
@Spy
@InjectMocks
private C c;
....
@Test
public void test(){
//this line executes fine
when(bList.size()).thenReturn(1);
//strangely this works fine
when(bMap.get(any())).thenReturn(bList);
//ClassCastException
when(bList.get(0)).thenReturn(b); //or when(bList.get(anyInt())).thenReturn(b);
c.methodIWantToTest();
}
}
L'exception que je reçois est:
java.lang.ClassCastException:
org.mockito.internal.creation.jmock.ClassImposterizer$ClassWithSuperclassToWorkAroundCglibBug$$EnhancerByMockitoWithCGLIB$$ cannot be cast to xyz.B
Quelqu'un a rencontré ce avant et de trouver une solution de contournement?
J'ai cherché une solution et avons rencontré quelques liens:
http://code.google.com/p/mockito/issues/detail?id=251
et
http://code.google.com/p/mockito/issues/detail?id=107
source d'informationauteur aces.
Vous devez vous connecter pour publier un commentaire.
Comme ce lien que vous avez posté l'indique, vous avez rencontré un bug avec
Answers.RETURNS_DEEP_STUBS
.Je n'ai pas vraiment de raison d'utiliser effectivement
RETURNS_DEEP_STUBS
dans votre exemple de code. Vous devriez vraiment essayer d'évaluer si oui ou non vous avez besoin profond de paie, parce que, comme le Mockito docs dire"chaque fois qu'un simulacre renvoie à un simulacre d'une fée meurt." Donc, si vous pouvez, il suffit de prendre cette sortie et votre exemple de travail.Toutefois, si vous insistez sur l'utilisation de la profondeur de paie, vous pouvez pirater autour de cette erreur de casting de la valeur de retour de l'appel de méthode à
Object
. Par exemple, remplacer la ligne incriminée dans votre code:Tout cela étant dit, je suis personnellement d'accord avec @jhericks. La meilleure solution est probablement d'utiliser un véritable
ArrayList
qui contient votre maquette par opposition à moqueurList
. Le seul problème est l'obtention de votre liste injecté, de sorte que vous auriez à utiliser@Spy
. Par exemple:Malheureusement, ce n'est pas possible
Cas: essais sur les API:
Principale raison de cette utilisation est de maintien de la compatibilité sur les temps de compilation.
Mais mockito ne peut pas soutenir les génériques dans les chaînes avec RETURNS_MOCKS et RETURNS_DEEP_STUBS options en raison du type d'effacement en java:
Résultat dans l'exemple ci-dessus doivent être ServerAction mais dans mockito il est l'Objet de la classe générée.
voir Question: ne Peut pas Retourner profonde talons de méthode générique qui renvoie type générique #484