现在很多项目都使用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的步骤重发一遍,在单元测试运行的时候,就能够正确的执行了。

12-19 12:24