Mockito间谍返回具有org.mockito.exceptions.misusing.WrongTypeOfReturnValue

时间:2019-01-24 13:42:52

标签: java mockito spy

我正在尝试使用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

间谍可以返回模拟对象吗?此错误的原因是什么?以及如何解决?

谢谢!

1 个答案:

答案 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();
相关问题