清單 5. 經過編輯的場景 2 的 ServiceClassTest 類
... private ServiceClass serviceClass; private Mock mockCollaborator; private Collaborator collaborator; public void setUp(){ serviceClass = new ServiceClass(); mockCollaborator = mock(Collaborator.class, "mockCollaborator"); } public void testRunServiceAndReturnFalse(){ mockCollaborator.expects(once()).method("executeJob").will(returnValue("failure")); collaborator = (Collaborator)mockCollaborator.proxy(); boolean result = serviceClass.runService(collaborator); assertFalse(result); } } |
這里有幾點需要注意。第一,runService()
方法簽名已經不同于以往。它現在不接受 ICollaborator
接口,而接受具體類實現(Collaborator
類)。就測試框架而言,此更改非常重大(注,雖然在本質上反對多態,但是我們將使用傳遞具體類的示例(僅供舉例之用)。在實際的面向對象的場景中絕對不能這樣做)。
第二,模擬 Collaborator
類的方式已經更改。使用 jMock CGLIB 庫可以模擬具體類實現。提供給 jMock CGLIB 的 mock()
方法的附加 String
參數被用作創建的模擬對象的標識符。使用 jMock(當然,還有 RMock)時,在單一測試用例內每個模擬對象設置都要求有惟一標識符。這對于在公共的 setUp()
方法中或在實際測試方法內定義的模擬對象來說是正確的。
第三,測試方法的原始期望并未更改。仍然要求有 false 證明才能使測試通過。這是十分重要的,因為通過展示使用的測試框架足夠靈活、可以適應各種輸入帶來的更改、同時仍然允許獲得不變的測試結果,使它們在無法調節輸入生成同樣的結果時展示了其實際限制。
現在,重新運行作為 JUnit 測試的測試。測試將通過,如下所示:
圖 4. 場景 2 測試通過

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