我正在尝试使用Mockito测试以下代码:
class Item {
String name;
int age;
String getInfo() {
return name + age.toString();
}
}
class Article {
Item item = new Item();
Article() {
}
void calculate() {
item = prepareItem();
String info = item.getInfo();
println("The info is " + info);
}
Item prepareItem() {
item.name = "item";
return item;
}
我正在尝试测试方法calculate()
,这是测试用例:
@Test
public void testCalculate() {
@Mock Item item;
Article article = new Article();
Article articleSpy = Mockito.spy(article);
Mockito.doReturn(item).when(articleSpy).prepareItem();
article.calculate();
}
然后我得到了以下信息:
org.mockito.exceptions.misusing.WrongTypeOfReturnValue:
Item$$EnhancerByMockitoWithCGLIB$$4ffb1868 cannot be returned by getMetaClass()
getMetaClass() should return MetaClass
间谍可以返回模拟对象吗?这个错误的原因是什么?如何修复?
谢谢!
@Mock
不适用于局部变量。你为什么需要模拟?我想你不需要嘲笑这个项目。只需根据您的需要创建一个测试对象Item
。Mock是为了防止调用真正的方法。
试试这个:
@Test
public void testCalculate() {
Item item = new Item();
Article article = new Article();
Article articleSpy = Mockito.spy(article);
Mockito.doReturn(item).when(articleSpy).prepareItem();
article.calculate();
}
如果你真的需要间谍返回Mock,Item item = Mockito.mock(Item.class);
应该在Mocktio 1.10中工作。我不建议你这样做,因为在大多数情况下,这是不需要的。大多数时候,您可以简化代码(=>测试驱动的开发)。
如果你绝对需要它,这将是一个有效的例子:
Item item = Mockito.mock(Item.class);
Mockito.when(item.getInfo()).thenReturn("bla bla");
Article article = Mockito.spy(Article.class);
Mockito.doReturn(item).when(article).prepareItem();
article.calculate();