web-dev-qa-db-fra.com

Mockito ClassCastException - Une maquette ne peut pas être exprimée

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?

12
user2844485

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.

25
JB Nizet

Votre objet fictif est amélioré par Mockito et il ne correspond pas à votre classe. Vous ne pouvez donc pas taper cast.

0
Aninda Bhattacharyya