首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回null的EasyMock

返回null的EasyMock
EN

Stack Overflow用户
提问于 2017-07-13 19:47:12
回答 2查看 874关注 0票数 2

我目前正在做一些使用EasyMock的测试用例。我的示例代码如下所示:

代码语言:javascript
复制
{
    dao = EasyMock.createNiceMock(Dao.class);

    initObj();
    EasyMock.replay(dao);
    // EasyMock.verify(dao);

    mapper = new Mapper();
    mapper.setDao(dao);
}
@Test
public void testmapper(){ 
    mapper.map();
}

public void initObj() {
    Obj o = new Obj();
    o.setX(2);
    EasyMock.expect(dao.findObj(1)).andReturn(o);
}

class Mapper {
    @Autowired
    private Dao dao;

    public Obj map(){
        Obj o = dao.findObj(1);
        System.out.println(o.getX());
        return o;
    }
    //getter and setter
}

如果我实际调用EasyMock.verify(dao);,它会抛出

代码语言:javascript
复制
java.lang.AssertionError: 
  Expectation failure on verify:
    dao.findObj(1): expected: 1, actual: 0
    at org.easymock.internal.MocksControl.verify(MocksControl.java:183)
    at org.easymock.EasyMock.verify(EasyMock.java:2142)
    ...

如果我不调用verify,我在Obj上的Mapper类中的第一次调用会导致NPE。我对EasyMock非常陌生,还找不到为什么它没有返回我在initObj中创建的Obj的原因。任何启发都是受欢迎的。我读了一些关于这个主题的问题和一些简单的教程,但它们对我没有帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-13 21:51:52

我找到了解决我的问题的办法。在我的initObj()方法中,我还必须定义预期行为的调用次数,如下所示:

代码语言:javascript
复制
public void initObj() {
    Obj o = new Obj();
    o.setX(2);
    EasyMock.expect(dao.findObj(1)).andReturn(o).times(1);
}

我仍然不明白没有times(1)它怎么能工作。我有一些来自一个同事的示例代码,它只需使用EasyMock.expect(dao.findObj(1)).andReturn(o);即可工作

票数 0
EN

Stack Overflow用户

发布于 2017-07-17 05:26:12

verify应该在您的测试之后。所以在mapper.map()之后。它用于验证是否进行了所有预期的调用。所以它发生在结尾是有意义的。

然后,使用您提供的代码绝对不可能获得NPE。除非你对getX和setX有什么问题。这是我的代码版本。它工作得很完美。

代码语言:javascript
复制
public class MyTest {

    private final Dao dao;
    private final Mapper mapper;

    {
        dao = EasyMock.createNiceMock(Dao.class);

        initObj();
        EasyMock.replay(dao);
        // EasyMock.verify(dao);

        mapper = new Mapper();
        mapper.setDao(dao);
    }

    @Test
    public void testmapper(){
        mapper.map();
        EasyMock.verify(dao);
    }

    public void initObj() {
        Obj o = new Obj();
        o.setX(2);
        EasyMock.expect(dao.findObj(1)).andReturn(o);
    }

    class Mapper {
        private Dao dao;

        public Obj map(){
            Obj o = dao.findObj(1);
            System.out.println(o.getX());
            return o;
        }

        public void setDao(Dao dao) {
            this.dao = dao;
        }
    }

    class Obj {
        private int x;

        public int getX() {
            return x;
        }

        public void setX(int x) {
            this.x = x;
        }
    }

    interface Dao {
        Obj findObj(int i);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45079720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档