代码之家  ›  专栏  ›  技术社区  ›  ratzip

Mockito spy返回带有org.Mockito.exceptions.misusing.ErrorTypeOfReturnValue的模拟对象

  •  0
  • ratzip  · 技术社区  · 7 年前

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

    spy可以返回模拟对象吗?这个错误的原因是什么?如何修复它?

    谢谢

    1 回复  |  直到 7 年前
        1
  •  0
  •   Hannes Schneidermayer    7 年前

    @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();
    
    推荐文章