我正在尝试使用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
间谍可以返回模拟对象吗?此错误的原因是什么?以及如何解决?
谢谢!
答案 0 :(得分:0)
@Mock
不适用于局部变量。为什么仍然需要模拟?我认为您不需要嘲笑该项目。只需根据需要创建测试对象Item
。嘲弄是为了防止真正的方法被调用。
尝试以下方法:
@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();
}
如果您真的需要间谍返回模拟,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();