use*_*485 13 java mocking mockito
我在课堂上有一个方法AppleProcessor,我想测试一下:
public void process(Fruit fruit) {
if(fruit.getType() == Fruit.APPLE) {
fruitBasket.add(((AppleFruit) fruit).getApple());
}
else {
// do something else
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,Fruit是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));
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
java.lang.ClassCastException: package.fruit.Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54 cannot be cast to package.fruit.AppleFruit
它来自测试中的这一行
when(((AppleFruit) fruit).getApple()).thenReturn(apple);
有谁知道如何解决这个问题,以便我可以测试我的代码?
JB *_*zet 31
当你说
@Mock
Fruit fruit;
Run Code Online (Sandbox Code Playgroud)
你告诉Mockito:fruit变量应该是一个实例Fruit.Mockito将动态创建一个实现Fruit(此类是Fruit$$EnhancerByMockitoWithCGLIB$$b8254f54)的类,并创建此类的实例.这个类没有理由成为一个实例AppleFruit,因为你没有告诉Mockito该对象必须是AppleFruit类型.
将其声明为AppleFruit,并且它将是类型AppleFruit.
小智 14
对于任何搜索此内容的人,只需包括:
@Mock(extraInterfaces = {AppleFruit.class})
Fruit fruit;
Run Code Online (Sandbox Code Playgroud)
这将为模拟添加一个额外的接口,并且转换不会引发任何异常。
Mockito 可以处理在模拟时(赋值)已经转换的模拟对象。但是,它在代码执行期间不会自行转换模拟对象。
换句话说(或者更好的是,代码):
Fruit fruit = Mockito.mock(Applefruit.class);
Run Code Online (Sandbox Code Playgroud)
只要按照 JB Nizet 所说的去做,你就会没事的。我遇到了类似的问题,他的解决方案有效。
对于这个问题,应该是:
@Mock
FruitBasket fruitBasket;
@Mock
AppleFruit fruit; // changed here
@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));
}
Run Code Online (Sandbox Code Playgroud)
这就是所需要的全部。
| 归档时间: |
|
| 查看次数: |
27700 次 |
| 最近记录: |