“jMock利用mock objects思想來對(duì)Java code進(jìn)行測(cè)試。jMock具有以下特點(diǎn):容易擴(kuò)展,讓你快速簡(jiǎn)單地定義mock objects,因此不必打破程序間的關(guān)聯(lián),你定義靈活的超越對(duì)象之間交互作用而帶來測(cè)試局限,減少你測(cè)試地脆弱性。”
??? 跟JMock功能類似的還有EasyMock。
??? 簡(jiǎn)單試驗(yàn)后的感覺沒有試驗(yàn)DBUnit后的感覺強(qiáng)烈,試了DBUnit的感覺是這東西以后一定要用.
??? 但個(gè)人認(rèn)為mock object這種東西能不用就不用,模擬來模擬去,最后還是要和真東西聯(lián)調(diào),所以mock的階段應(yīng)該是盡可能的短才是.
使用模仿對(duì)象進(jìn)行測(cè)試的常用編碼樣式是:
· 創(chuàng)建模仿對(duì)象的實(shí)例
· 設(shè)置模仿對(duì)象中的狀態(tài)和期望值
· 將模仿對(duì)象作為參數(shù)來調(diào)用域代碼
· 驗(yàn)證模仿對(duì)象中的一致性
代碼中的大概過程:
???? Mock mock = new Mock(**.class);//構(gòu)造一個(gè)那個(gè)類的mock對(duì)象,把這個(gè)類傳入Mock
???? 使用mock.expects方法,來設(shè)置想要執(zhí)行的操作:執(zhí)行幾次、執(zhí)行哪個(gè)方法、傳什么參、返回什么值
?????獲得那個(gè)mock對(duì)象:** x = (**)mock.proxy();//proxy方法返回代理類實(shí)例,即虛擬對(duì)象實(shí)例
???? 然后run **.class的那個(gè)方法(call methods on the mock object, expectation on it will deliver the result set up by yourself)
???? 寫mock-object 測(cè)試,需要有獨(dú)立的接口作為mock的對(duì)象(從而促進(jìn)了針對(duì)接口編程的習(xí)慣),還有個(gè)好的副作用:他迫使你來重寫一些代碼。實(shí)際上,代碼常常寫的不好。你讓類和環(huán)境之間產(chǎn)生了不必要的耦合。