使用jMock輔助單元測試
作者:冰雲
時間:2004-04-16
聯繫:icecloud(AT)sina.com
Blog:http://icecloud.51.net
jMock是Junit的一個增強庫。源於http://www.jmock.org。
jMock簡單易用,非常適合TDD中的Mock測試模式
首先我們來看一段簡單測試代碼
package name.nona.test.jmock; import java.sql.SQLException; import java.sql.Statement; import org.jmock.Mock; import org.jmock.MockObjectTestCase; public class TestUsageOfJmock extends MockObjectTestCase { public void testDatabaseUseage() throws SQLException{ Mock mockStmt = new Mock(Statement.class); String sql = "select * from test";
mockStmt.expect(once()).method("execute") .with(eq(sql)).will(returnValue(false)); Statement stmt = (Statement) mockStmt.proxy(); assertFalse(stmt.execute(sql)); } } |
可以看到,上面是製作了一個假的(Mock)的Statement對象,
通過對這個對象的execute操作,返回一個false值。
其中,關鍵的語句是
mockStmt.expect(once()).method("execute").with(eq(sql)).will(returnValue(false));
解釋如下:
expect: 期待的執行次數,可以有 once,atLeastOnce(),notCalled()三種。
method 期待調用的方法名,這裏是execute
with 方法需要的參數,如果沒有的話就不用寫with,直接will
will 返回值,沒有就不寫啦
其中的once, eq, returnValue都是繼承自MockObjectTestCase的方法。
執行後,Green,成功。嘗試兩次調用 assertFalse(stmt.execute(sql)); 提示錯誤。
jMock是通過CGLIB的DynamicProxy來實現的mock功能。
注:本文僅是對jMock的一個簡單介紹,沒有太多內容。更多的東西需要你自己來探索,例如jMock的設計很有意思,使用了ValueObject模式等等。
如果對Jmock有興趣,請訪問http://www.jmock.org。 你可以下載最新的jMock包來使用,可能在接口上有些不同,但基本的調用已經定型不變(如上)。
1.0stable的版本正在開發中,幫助很少,通過看JavaDoc和testCase你可以瞭解到最新的用法。
|