Mockito ClassCastException - Mock 不能被投射

2022-09-02 05:26:44

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

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

请注意,Fruit是AppleFruit实现的方法的接口,并且还有一个方法。getType()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);

有人知道如何解决这个问题,以便我可以测试我的代码吗?


答案 1

当你说

@Mock
Fruit fruit;

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

将其声明为 ,它将是 类型 。AppleFruitAppleFruit


答案 2

对于任何搜索此内容的人,只需包括:

@Mock(extraInterfaces = {AppleFruit.class})
Fruit fruit;

这将为模拟添加一个额外的接口,并且转换不会引发任何异常。


推荐