J'ai une méthode dans la classe AppleProcessor
que je voudrais tester:
public void process(Fruit fruit) {
if(fruit.getType() == Fruit.Apple) {
fruitBasket.add(((AppleFruit) fruit).getApple());
}
else {
// do something else
}
}
Notez que Fruit est une interface avec la méthode getType()
que AppleFruit implémente et possède également une méthode getApple()
.
Mon test ressemble à:
@Mock
FruitBasket fruitBasket;
@Mock
Fruit fruit;
@Mock
AppleFruit Apple;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
}
@Test
public void testAnAppleIsProcessed() {
AppleProcessor appleProcessor = new AppleProcessoer();
when(fruit.getType()).thenReturn(Fruit.Apple);
when(((AppleFruit) fruit).getApple()).thenReturn(Apple);
appleProcessor.process(fruit);
verify(fruitBasket).add(isA(Apple.class));
}
Cependant, j'obtiens l'erreur suivante:
Java.lang.ClassCastException: package.fruit.Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54 cannot be cast to package.fruit.AppleFruit
qui vient de cette ligne dans le test
when(((AppleFruit) fruit).getApple()).thenReturn(Apple);
Quelqu'un sait-il comment résoudre ce problème afin que je puisse tester mon code?
Quand tu dis
@Mock
Fruit fruit;
Vous dites à Mockito: la variable fruit
devrait être une instance de Fruit
. Mockito créera dynamiquement une classe qui implémentera Fruit
(cette classe est Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54
) et créera une instance de cette classe. Il n'y a aucune raison pour que cette classe soit une instance de AppleFruit
, puisque vous n'avez pas dit à Mockito que l'objet devait être de type AppleFruit.
Déclarez-le en tant que AppleFruit
et il sera de type AppleFruit
.
Votre objet fictif est amélioré par Mockito et il ne correspond pas à votre classe. Vous ne pouvez donc pas taper cast.