2015-02-11 97 views
8

我在班上AppleProcessor的方法,我想測試:的Mockito ClassCastException異常 - 一個模擬無法施展

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

注意,水果與方法getType()這AppleFruit實現的接口,也有一個getApple()方法。

我的測試看起來像:

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

不過,我得到以下錯誤:

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

它來自該行的測試

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

會任何人k現在如何解決這個問題,我可以測試我的代碼?

回答

22

當你說

@Mock 
Fruit fruit; 

你告訴的Mockito:在fruit變量應該是Fruit一個實例。 Mockito將動態創建一個實現Fruit(該類爲Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54)的類,並創建該類的一個實例。這個類沒有理由成爲AppleFruit的實例,因爲你沒有告訴Mockito該對象必須屬於AppleFruit類型。

聲明它爲AppleFruit,它將是AppleFruit類型。

+0

謝謝,測試現在可以使用。 – user2844485 2015-02-11 19:33:30

0

Mockito增強了您的模擬對象,它與您的課程不同,因此您無法鍵入強制轉換。

+0

那麼沒有不使用模擬對象的方法嗎? – user2844485 2015-02-11 19:24:58

+2

確實存在。我建議用appleFruit實例調用方法,而不是水果。 – 2015-02-11 19:28:25