您的位置:軟件測(cè)試 > 開(kāi)源軟件測(cè)試 > 開(kāi)源單元測(cè)試工具 >
利用Eclipse進(jìn)行單元測(cè)試
作者:網(wǎng)絡(luò)轉(zhuǎn)載 發(fā)布時(shí)間:[ 2013/2/19 15:20:35 ] 推薦標(biāo)簽:

第二,模擬 Collaborator 類(lèi)的方式已經(jīng)更改。使用 jMock CGLIB 庫(kù)可以模擬具體類(lèi)實(shí)現(xiàn)。提供給 jMock CGLIB 的 mock() 方法的附加 String 參數(shù)被用作創(chuàng)建的模擬對(duì)象的標(biāo)識(shí)符。使用 jMock(當(dāng)然,還有 RMock)時(shí),在單一測(cè)試用例內(nèi)每個(gè)模擬對(duì)象設(shè)置都要求有惟一標(biāo)識(shí)符。這對(duì)于在公共的 setUp() 方法中或在實(shí)際測(cè)試方法內(nèi)定義的模擬對(duì)象來(lái)說(shuō)是正確的。

第三,測(cè)試方法的原始期望并未更改。仍然要求有 false 證明才能使測(cè)試通過(guò)。這是十分重要的,因?yàn)橥ㄟ^(guò)展示使用的測(cè)試框架足夠靈活、可以適應(yīng)各種輸入帶來(lái)的更改、同時(shí)仍然允許獲得不變的測(cè)試結(jié)果,使它們?cè)跓o(wú)法調(diào)節(jié)輸入生成同樣的結(jié)果時(shí)展示了其實(shí)際限制。

現(xiàn)在,重新運(yùn)行作為 JUnit 測(cè)試的測(cè)試。測(cè)試將通過(guò),如下所示:

圖 4. 場(chǎng)景 2 測(cè)試通過(guò)

在下一個(gè)場(chǎng)景中,情況會(huì)變得略微復(fù)雜一些。您將使用 RMock 框架來(lái)相對(duì)緩解一下這種困難的情形。

場(chǎng)景 3:使用 jMock 和 RMock 模擬帶有非默認(rèn)構(gòu)造函數(shù)的具體類(lèi)

首先像以前一樣嘗試使用 jMock 來(lái)模擬 Collaborator 對(duì)象 —— 只是這一次,Collaborator 沒(méi)有默認(rèn)的無(wú)參數(shù)構(gòu)造函數(shù)。注,保留布爾 false 結(jié)果的測(cè)試期望。

同時(shí)假定 Collaborator 對(duì)象要求使用字符串和原始的 int 作為傳遞給構(gòu)造函數(shù)的參數(shù)。清單 6 顯示了對(duì) Collaborator 對(duì)象所做的更改。

清單 6. 經(jīng)過(guò)編輯的場(chǎng)景 3 的 Collaborator 類(lèi)

               
public class Collaborator{
   private String collaboratorString;
   private int collaboratorInt;
 
   public Collaborator(String string, int number){
     collaboratorString = string;
     collaboratorInt = number;
   }
   public String executeJob(){
     return "success";
  }
}


Collaborator 類(lèi)構(gòu)造函數(shù)仍然十分簡(jiǎn)單。用傳入?yún)?shù)設(shè)定類(lèi)字段。這里不必使用任何其他邏輯,并且其 executeJob() 函數(shù)保持不變。

重新運(yùn)行測(cè)試,并且示例的所有其他組件保持不變。結(jié)果是災(zāi)難性的測(cè)試失敗,如下所示:

圖 5. 場(chǎng)景 3 測(cè)試失敗

以上測(cè)試是作為簡(jiǎn)單的 JUnit 測(cè)試運(yùn)行的,沒(méi)有代碼覆蓋。您可以用大多數(shù)代碼覆蓋工具(例如,Cobertura 或 EclEmma)來(lái)運(yùn)行本文中列出的任何一個(gè)測(cè)試。但是,用 Eclipse 內(nèi)的代碼覆蓋工具運(yùn)行 RMock 測(cè)試時(shí)會(huì)帶來(lái)一些問(wèn)題(參見(jiàn) 表 1)。以下代碼顯示了實(shí)際堆棧跟蹤的代碼片段。

清單 7. 場(chǎng)景 3 中測(cè)試失敗的堆棧跟蹤

               
 ...Superclass has no null constructors but no arguments were given
at net.sf.cglib.proxy.Enhancer.emitConstructors(Enhancer.java:718)
at net.sf.cglib.proxy.Enhancer.generateClass(Enhancer.java:499)
at net.sf.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at net.sf.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)
at net.sf.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:285)
at net.sf.cglib.proxy.Enhancer.create(Enhancer.java:660)
  .....
  .....


失敗原因是 jMock 無(wú)法通過(guò)沒(méi)有無(wú)參數(shù)構(gòu)造函數(shù)的類(lèi)定義創(chuàng)建可行的模擬對(duì)象。實(shí)例化 Collaborator 對(duì)象的惟一方法是提供兩個(gè)簡(jiǎn)單參數(shù)。您現(xiàn)在必須找到一種方法把參數(shù)提供給模擬對(duì)象實(shí)例化過(guò)程以達(dá)到同樣的效果,這是使用 RMock 的原因。

用 RMock 測(cè)試框架更正失敗的測(cè)試

要更正測(cè)試,必須執(zhí)行一些修改。這些更改可能顯得十分重要,但是實(shí)際上,它們是一種相對(duì)簡(jiǎn)單的解決方法,利用兩種框架的強(qiáng)大功能來(lái)實(shí)現(xiàn)目的。

上一頁(yè)1234567下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd