2015-02-11 12 views
8

gegossen werden habe ich eine Methode in der Klasse AppleProcessor die Ich mag würde Test:Mockito Classcast - Ein Mock nicht

public void process(Fruit fruit) { 
    if(fruit.getType() == Fruit.APPLE) { 
     fruitBasket.add(((AppleFruit) fruit).getApple()); 
    } 
    else { 
     // do something else 
    } 
} 

Beachten Sie, dass Obst ist eine Schnittstelle, mit der Methode getType() die Geräte AppleFruit und hat auch eine getApple() Methode.

Mein Test wie folgt aussieht:

@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)); 
} 

Allerdings bekomme ich folgende Fehlermeldung:

java.lang.ClassCastException: package.fruit.Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54 cannot be cast to package.fruit.AppleFruit

, die in dem Test von dieser Linie kommt

when(((AppleFruit) fruit).getApple()).thenReturn(apple);

Would irgendjemand k Wie kann ich das nun beheben, damit ich meinen Code testen kann?

Antwort

22

Wenn Sie sagen,

@Mock 
Fruit fruit; 

Sie Mockito sagen: die fruit Variable eine Instanz von Fruit sein sollte. Mockito erstellt dynamisch eine Klasse, die Fruit implementiert (diese Klasse ist Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54), und erstellt eine Instanz dieser Klasse. Es gibt keinen Grund für diese Klasse, eine Instanz von AppleFruit zu sein, da du Mockito nicht gesagt hast, dass das Objekt vom Typ AppleFruit sein muss.

Erklären Sie es als AppleFruit, und es wird vom Typ AppleFruit sein.

+0

Danke, der Test funktioniert jetzt. – user2844485

0

Ihr Mock-Objekt wurde von Mockito verbessert und es ist nicht dasselbe wie Ihre Klasse, Sie können also nicht Cast eingeben.

+0

Also gibt es keinen Weg, ohne ein Mock-Objekt zu verwenden? – user2844485

+2

Es gibt definitiv. Ich würde vorschlagen, rufen Sie die Methode mit AppleFruit-Instanz, nicht Obst. –

Verwandte Themen