private Collaborator collaborator;
public void setUp(){
serviceClass = new ServiceClass();
Object[] objectArray = new Object[]{"exampleString", 5};
collaborator =
(Collaborator)intercept(Collaborator.class, objectArray, "mockCollaborator");
}
public void testRunServiceAndReturnFalse(){
collaborator.executeJob();
modify().returnValue("failure");
startVerification();
boolean result = serviceClass.runService(collaborator);
assertFalse(result);
}
}
首先,需要注意測試的期望仍未改變。RMockTestCase 類的導入預示著引入 RMock 框架功能。接下來,測試類現在將擴展 RMockTestCase,而不是 MockObjectTestCase。稍后,我將向您展示在 TestClass 對象仍為 RMockTestCase 類型的對象的測試用例中重新引入 MockObjectTestCase。
使用 intercept() 方法的備選方法
通過 RMock,您可以使用 intercept() 方法僅模擬具體類?梢允褂 RMock mock() 方法模擬具體類和接口。僅當需要模擬那幾個重要方法時,使用 interface() 方法。此方法被視為經過改進的 mock() 方法。
在 setUp() 方法內,用 Collaborator 類的構造方法所需的實際 值實例化對象數組。該數組被立刻傳遞給 RMock 的 intercept() 方法來幫助實例化模擬對象。方法的簽名類似于 jMock CGLIB mock() 方法的簽名,因為這兩種方法將接納惟一模擬對象標識符作為參數。模擬對象到 Collaborator 類型的類強制轉換十分有必要,因為 intercept() 方法將返回類型 Object。
在測試方法本身 testRunServiceAndReturnFalse() 之內,您可以看到更多更改。模擬 Collaborator 對象的 executeJob() 方法將被調用。在此階段,模擬對象處于記錄狀態 —— 即簡單地定義對象將一直期望的方法調用,因此,模擬將相應地記錄期望。下一行是對模擬對象的通知,用于確保當它遇到 executeJob() 方法時,它應當返回字符串 failure。因此,使用 RMock,您只需通過調用方法而不調用模擬對象(并傳遞它可能需要的任何參數)來描述期望,然后修改該期望以相應地調整任何返回類型。
最后,調用 RMock 方法 startVerification() 把模擬 Collaborator 對象轉為就緒狀態。模擬對象現已準備好在 ServiceClass 類中作為實際對象使用。該方法非常重要并且必須調用它才能避免測試初始化失敗。
測試更改
再次重新運行 ServiceClassTest 以達到最終的肯定結果:在模擬對象實例化期間提供的參數造成了所有差別。圖 6 顯示 JUnit 測試已經通過。
圖 6. 使用 RMock 的場景 3 測試成功

文章來源于領測軟件測試網 http://www.kjueaiud.com/