我在类AppleProcessor中有一个方法要测试:

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

请注意,Fruit是AppleFruit实现的方法getType()的接口(interface),并且还具有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);
有人知道如何解决这个问题,以便我可以测试我的代码吗?

最佳答案

当你说

@Mock
Fruit fruit;

您告诉Mockito:fruit变量应该是Fruit的实例。 Mockito将动态创建一个实现Fruit的类(此类是Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54),并创建该类的实例。此类没有理由成为AppleFruit的实例,因为您没有告诉Mockito该对象必须是AppleFruit类型。

将其声明为AppleFruit,并将其类型为AppleFruit

关于java - Mockito ClassCastException-无法转换模拟,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28462611/

10-10 19:03