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

清單 10. 場景 4 的測試示例

               
public class MyNewClassTest extends RMockTestCase{

private MyNewClass myClass;
private MockObjectTestCase testCase;
private Collaborator collaborator;
private Mock mockClassB;

    public void setUp(){
        myClass = new MyNewClass();

        testCase = new MyMockObjectTestCase();

        mockClassB = testCase.mock(ClassB.class, "mockClassB");
     mockClassB.expects(testCase.once()).method("wierdMethod").
                will(testCase.returnValue("passed"));

        Class[] someClassArray = new Class[]{String.class, ClassA.class, ClassB.class};
        Object[] someObjectArray = new Object[]
          {"someArbitraryString", new ClassA(), (ClassB)mockClassB.proxy()};

        collaborator = (Collaborator)intercept
                (Collaborator.class, someClassArray, someObjectArray, "mockCollaborator");
    }

    public void testRMockAndJMockInCollaboration(){
        startVerification();
        assertTrue(myClass.executeJob(collaborator));
    }

    private class MyMockObjectTestCase extends MockObjectTestCase{}

    private class MyNewClass{
        public boolean executeJob(Collaborator collaborator){
            collaborator.executeSomeImportantFunction();
            return true;
        }
    }
}


在 setUp() 方法內(nèi),根據(jù)為擴(kuò)展 jMock-CGLIB MockObjectTestCase 對象而創(chuàng)建的私有內(nèi)部類實(shí)例化了新 "testcase"。使用任何 jMock 功能時(shí),這個(gè)小解決方法對于確保整個(gè)測試類為 RMock TestCase 對象十分有必要。例如,您將設(shè)定類似 testCase.once() 而不是類似 once() 的 jMock 期望,因?yàn)?TestClass 對象將擴(kuò)展 RMockTestCase。

構(gòu)建基于 ClassB 類的模擬對象并向其提供期望。然后您將使用它幫助實(shí)例化 RMock Collaborator 模擬對象。待測試的類是 MyNewClass 類(在這里顯示為私有內(nèi)部類)。同時(shí),其 executeJob() 方法將接收 Collaborator 對象并運(yùn)行 executeSomeImportantFunction() 方法。

清單 11 和 12 分別顯示了 ClassA 和 ClassB 的代碼。ClassA 是沒有實(shí)現(xiàn)的簡單類,而 ClassB 顯示了闡明要點(diǎn)所需的少細(xì)節(jié)。

清單 11. ClassA 類

               
public class ClassA{}


此類只是我使用的一個(gè)虛構(gòu)類,用于強(qiáng)化一個(gè)要點(diǎn):要模擬構(gòu)造函數(shù)接收對象參數(shù)的類,有必要使用 RMock。

清單 12. ClassB 類

               
public class ClassB{
      public ClassB(){}
        public String wierdMethod(){
            return "failed";
        }
    }


ClassB 類的 wierdMethod 將返回 failed。這是十分重要的,因?yàn)樵擃惐仨毢喍痰胤祷亓硪粋(gè)字符串才能使測試通過。

清單 13 顯示了測試示例的重要部分:Collaborator 類。

清單 13. Collaborator 類

               
public class Collaborator {
  private String  _string;
    private ClassA _classA;
    private ClassB _classB;

    public Collaborator(String string, ClassA classA, ClassB classB) throws Exception{
         _string = string;
        _classA = classA;
        if(classB.wierdMethod().equals("passed")){
            _classB =classB;
        }
        else{
                throw new Exception("Something bad happened");
        }
    }

    public void executeSomeImportantFunction(){
    }
}


注,首要的是,使用 jMock 框架模擬了 ClassB 類。使用 RMock,沒有一種實(shí)際方法從模擬對象中提取和使用代理,以便在測試 setUp() 方法中的其他位置使用該代理。使用 RMock,僅當(dāng)調(diào)用 startVerification() 方法之后,才顯示代理對象。本例中的優(yōu)點(diǎn)是使用 jMock,因?yàn)樵谛枰祷刈晕夷M對象的情況下,可以 獲得設(shè)置其他模擬對象所需的信息。

反過來,需要注意的第二點(diǎn)是您不能使用 jMock 框架來模擬 Collaborator 類。原因是該類沒有無參數(shù)構(gòu)造函數(shù)。此外,在構(gòu)造函數(shù)內(nèi)有某種邏輯,這種邏輯將確定是否先獲得實(shí)例。事實(shí)上,出于本次討論的目的,ClassB 中的 wierdMethod() 方法必須返回 passed 才能使 Collaborator 對象被實(shí)例化。但是,另請注意,在默認(rèn)情況下,方法總是返回 failed。測試成功明顯需要模擬 ClassB。

此外,不同于先前的示例,此場景中的類數(shù)組作為附加參數(shù)被包含到了 intercept() 方法中。對此不作嚴(yán)格要求,但是用它作為密鑰可以快速識別在實(shí)例化 RMock 測試對象時(shí)使用的對象類。

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