在測試方法本身 testRunServiceAndReturnFalse()
之內,您可以看到更多更改。模擬 Collaborator
對象的 executeJob()
方法將被調用。在此階段,模擬對象處于記錄狀態 —— 即簡單地定義對象將一直期望的方法調用,因此,模擬將相應地記錄期望。下一行是對模擬對象的通知,用于確保當它遇到 executeJob()
方法時,它應當返回字符串 failure。因此,使用 RMock,您只需通過調用方法而不調用模擬對象(并傳遞它可能需要的任何參數)來描述期望,然后修改該期望以相應地調整任何返回類型。
最后,調用 RMock 方法 startVerification()
把模擬 Collaborator
對象轉為就緒狀態。模擬對象現已準備好在 ServiceClass
類中作為實際對象使用。該方法非常重要并且必須調用它才能避免測試初始化失敗。
再次重新運行 ServiceClassTest
以達到最終的肯定結果:在模擬對象實例化期間提供的參數造成了所有差別。圖 6 顯示 JUnit 測試已經通過。
圖 6. 使用 RMock 的場景 3 測試成功

assertFalse(result)
代碼行表示與場景 1 相同的測試期望,而 RMock 像 jMock 以前那樣維持測試成功。在許多方面,這都十分重要,但是這里更重要的特點可能是實踐了修正失敗測試的靈活 原則而不更改測試期望。惟一的差別是使用了另一個框架。
在下一個場景中,您將在一種特殊情況下使用 jMock 和 RMock。沒有一個框架能夠僅憑自身就實現正確結果,除非在測試內形成某種聯合。
如前所述,我希望檢驗兩個框架必須協同工作才能實現某個結果的情況。否則,構建良好的測試每次都將失敗。在某些情況下,使用 jMock 還是 RMock 并不重要,例如,當需要模擬的接口或類存在于已經簽名的 JAR 中時。此類情況十分少見,但是當測試針對安全專有的產品(通常是這樣或那樣的一類現有軟件)中的應用程序編程接口 (API) 編寫代碼時可能會出現此情況。
清單 10 顯示了兩個框架完成測試用例的示例。
文章來源于領測軟件測試網 http://www.kjueaiud.com/