您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 >
利用Eclipse進行單元測試
作者:網絡轉載 發(fā)布時間:[ 2013/2/19 15:20:35 ] 推薦標簽:

清單 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() 方法內,根據為擴展 jMock-CGLIB MockObjectTestCase 對象而創(chuàng)建的私有內部類實例化了新 "testcase"。使用任何 jMock 功能時,這個小解決方法對于確保整個測試類為 RMock TestCase 對象十分有必要。例如,您將設定類似 testCase.once() 而不是類似 once() 的 jMock 期望,因為 TestClass 對象將擴展 RMockTestCase。

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

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

清單 11. ClassA 類

               
public class ClassA{}


此類只是我使用的一個虛構類,用于強化一個要點:要模擬構造函數(shù)接收對象參數(shù)的類,有必要使用 RMock。

清單 12. ClassB 類

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


ClassB 類的 wierdMethod 將返回 failed。這是十分重要的,因為該類必須簡短地返回另一個字符串才能使測試通過。

清單 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,沒有一種實際方法從模擬對象中提取和使用代理,以便在測試 setUp() 方法中的其他位置使用該代理。使用 RMock,僅當調用 startVerification() 方法之后,才顯示代理對象。本例中的優(yōu)點是使用 jMock,因為在需要返回自我模擬對象的情況下,可以 獲得設置其他模擬對象所需的信息。

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

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

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