zoukankan      html  css  js  c++  java
  • EasyMock.replay()有什么用

    现在很多项目都使用EasyMock来作为单元测试框架。

    EasyMock一个方法,基本上是三步:EasyMock.expect()、EasyMock.replay()、EasyMock.verify()。

    在写单元测试的时候按这三步写,并不清楚EasyMock.replay()到底有什么作用。

    因为在很多单元测试里,把EasyMock.replay()去掉并不影响单元测试的运行。

    @Test
    public void queryBookListTest() {
            
        EasyMock.expect(myDatabase.queryList()).andReturn(null);
            
        List<Book> bookList = bookDaoImpl.queryBookList();
            
        Assert.assertTrue(bookList == null);
    }

     那么EasyMock.replay()到底有什么作用呢,在什么情况下才必须要有EasyMock.replay()单元测试才能正常运行呢?

    来看一下必须有EasyMock.replay()才能正常运行的情况:

    源码:

    @Override
    public List<Book> queryBookList() {
    
        List<Book> bookList = database.queryList();
        if (bookList == null) {
            bookList = database.queryList();
        }
        return bookList;
    }

    单元测试代码:

    @Test
    public void queryBookListTest() {
            
        EasyMock.expect(myDatabase.queryList()).andReturn(null);
        EasyMock.expect(myDatabase.queryList()).andReturn(null);
            
        mockControl.replay();
            
        List<Book> bookList = bookDaoImpl.queryBookList();
            
        mockControl.verify();
            
        Assert.assertTrue(bookList == null);
    }

    运行结果:

     来看看把EasyMock.replay()去掉会怎样:

    @Test
    public void queryBookListTest() {
            
        EasyMock.expect(myDatabase.queryList()).andReturn(null);
        EasyMock.expect(myDatabase.queryList()).andReturn(null);
            
        List<Book> bookList = bookDaoImpl.queryBookList();
            
        Assert.assertTrue(bookList == null);
    }

    运行结果:

     可以看到,报错了,单元测试没有运行成功。

    当代码里涉及到同一个接口方法多次调用时,如果仅仅是在单元测试里EasyMock方法,而没有replay()时,在单元测试运行的时候,是无法对接口方法进行Mock的。

    EasyMock.replay()是将Mock的行为按照Mock的步骤重发一遍,在单元测试运行的时候,就能够正确的执行了。

  • 相关阅读:
    树状数组基本操作
    P1802 5倍经验日 题解
    函数学习总结
    康托展开
    中国电信CDMA无线上网卡短信收发
    报错:无法获取实体类XXX对应的表名!
    javajvisualvm远程监控云服务器上的Tomcat8.5
    服务器防火墙开放端口
    报错:列"AGENT_ENTITY_NAME"的值太大(实际值: 60,最大值50) oracle VARCHAR2和NVARCHAR2的区别
    linux中查看端口是否被占用lsof i:port
  • 原文地址:https://www.cnblogs.com/ld-mars/p/12082200.html
Copyright © 2011-2022 走看看