java - Mockito ClassCastException - 无法转换模拟

标签 java mocking mockito

我想测试 AppleProcessor 类中的一个方法:

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

请注意,Fruit 是一个接口(interface),其中包含 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 无法转换为 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/

相关文章:

java - 使用观察者模式在模型中抛出异常

java - 在JAVA中读取JSON数组

java - 装饰器模式和哈希码

java - 模拟配置接口(interface)作为练习?

c# - 如何为依赖于 SerialPort 的类编写单元测试?

testing - Mockito Liferay 服务测试

java - 如何使用 PowerMockito 模拟带有可变参数的构造函数?

java - Spring 服务应该是 null 安全的吗?

java - 如何使用 Junit 和 Mockito 使用 spring 存储库测试 void 方法

java - Android 测试和模拟 : add to a List