我想测试 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/