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