欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

EasyMock.replay()有什么用

程序员文章站 2022-05-07 13:54:38
现在很多项目都使用EasyMock来作为单元测试框架。 EasyMock一个方法,基本上是三步:EasyMock.expect()、EasyMock.replay()、EasyMock.verify()。 在写单元测试的时候按这三步写,并不清楚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()单元测试才能正常运行呢?

来看一下必须有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()有什么用

 

 来看看把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()有什么用

 

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

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

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