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的步驟重發一遍,在單元測試運行的時候,就能夠正確的執行了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM