24分钟学会用JMock进行单元测试
http://tech.it168.com/jd/2008-01-12/200801120506372.shtml
【IT168 技術文檔】不管是測試驅動開發或者是其它的開發模式,都會需要對代碼進行單元測試,對于關聯依賴關系少或者比較簡單的類來說,直接使用JUnit就可以輕松的完成測試工作,但是對于關聯到其它比較復雜的類或對運行環境有要求的類的單元測試,比如ejb,servlet或Dao等,測試起來或者需要配置特定的環境,或者十分耗時,給單元測試造成困難。在這里介紹使用JMock來模擬那些不需要測試的類,幫助完成有單元測試。
例如,有這樣兩個類,一個是Dao.java,用于數據庫訪問成操作的,一個是Business.java,需要調用Dao進行業務處理。Dao.java是已經在有數據庫的環境測試通過的,現在需要測試Business.java。通常情況下,我們需要在測試環境配置好數據庫連接環境,并且需要準備數據后,才可以開始Business.java的測試,現在如果通過JMock就可以不配置數據庫環境,也可以完成測試。
JMock網站鏈接:http://www.jmock.org
//Dao.java package com.raistlin.test.jmockpublic class Dao{public Dao(){}public List execute(String sql){//數據庫操作... }}//Business.java package com.raistlin.test.jmockpublic class Business{private Dao dao ;public void setDao(Dao dao){this.dao = dao;}public String operate(){List list = dao.execute("select * from tbl_test");return (String) list.get(0);}}//BusinessTest.java package com.raistlin.test.jmockimport org.jmock.cglib.MockObjectTestCase;import org.jmock.cglib.Mock;public class BusinessTest extends MockObjectTestCase{private Mock mockDao = null;private Business business = null;protected void setUp() throws Exception{super.setUp();mockDao = new Mock(Dao.class);business = new Business();}protected void tearDown() throws Exception{mockDao = null;business = null;super.tearDown();}public void testOperate(){ArrayList stubList = new ArrayList();stubList.add("test");// 定義Mock劇本 mockDao.expects(once())// 期待次數 .method("execute")// 調用方法 .with(eq("select * from tbl_test"))// 傳入參數等于 .will(this.returnValue(stubList));// 返回對象 Dao dao = (Dao) mockDao.proxy();business.setDao(dao);assertEquals(business.operate(), "test");}}在工程中導入jmock-1.0.1.jar ,jmock-cglib-1.0.1.jar ,cglib-full-2.0.jar 三個jar包,然后在JUnit中執行BusinessTest.java,會顯示綠棒,這樣,在沒有數據庫的情況下,單元測試成功。
使用JMock模擬類的條件:
1、要有無參數的構造器;
2、構造器是public;
這樣對于private的構造器或單例模式的類應該是無法模擬了。這樣就要求我們養成針對接口編程的習慣,對接口用JMock進行模擬將不受這些限制。只需要將
import org.jmock.cglib.MockObjectTestCase;
import org.jmock.cglib.Mock;
改為
import org.jmock.MockObjectTestCase;
import org.jmock.Mock;
即可。
對于Mock類,有很多API可供使用,比如:
isA(Class clz) 表示為某個類
isVoid() 將will()換成isVoid()表示無返回值
詳細API可以參考一下DOC,還會找到很多有用的東西。
?
總結
以上是生活随笔為你收集整理的24分钟学会用JMock进行单元测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Maven实战——常用Maven插件介绍
- 下一篇: Eclipse使用SVN