replay(mockRequest);
assertTrue(HttpServletRequestUtil.validate(mockRequest));
verify(mockRequest);
}
}
首先,我們通過 EasyMock 提供的靜態方法 createMock 創建 Mock 對象 mockRequest。當 Mock 對象創建好以后,我們就可以對 Mock 對象的預期行為和輸出進行設定。對預期行為和輸出的設定分成兩個部分:(1)對指定方法進行調用;(2)對預期輸出進行設定。在上例中,mockRequest.getHeader("Host"); 對 Mock 對象的 getHeader 方法進行了調用,之后用 expectLastCall().andReturn("www.ibm.com:80").times(1) 對Mock對象的預期輸出進行了設定。andReturn 方法設定了當 getHeader 方法被調用時,將返回字符串 "www.ibm.com:80",times 方法設定了該方法預期被調用的次數是1。
在結束對 Mock 對象預期行為和方法的設定之后,我們可以調用 replay 靜態方法將 mockRequest 對象切換成回放狀態。在回放狀態下,Mock 對象的方法調用將返回預先設定的輸出。在上例中,HttpServletRequestUtil 類的 validate 方法對 mockRequest 的 getHeader 方法進行了調用,并對得到的值進行驗證。
最后,我們可以用 verify 方法來驗證預期方法的調用是否真的完成了。如果將上例中 expectLastCall().andReturn("www.ibm.com:80").times(1) 設定的調用次數修改為2,而實際測試中只調用了一次該方法,您將會看到以下的錯誤:
清單2:verify 驗證錯誤
java.lang.AssertionError:
Expectation failure on verify:
getHeader("Host"): expected: 2, actual: 1
at org.easymock.internal.MocksControl.verify
at org.easymock.EasyMock.verify
at org.easymock.demo.testcase.HttpServletRequestTestCase.testHttpSevletRequest
通過示例,我們了解了 EasyMock 的使用方法。EasyMock 能為單元測試提供了一定的便利,然而,它也有一些明顯的不足之處:
- 測試數據和預期結果以編碼的形式寫在測試用例中,測試數據的任何微小變化都會導致代碼的重新編譯和部署;
- 被測試模塊所包含的方法和參數硬編碼在測試代碼中,方法或參數的變化將導致所有相關測試代碼的修改(例如 HttpServletRequest 中的參數常常會在開發過程中發生改變,這會影響大量測試代碼);
- 單元測試的測試過程包含在測試代碼中,當測試用例發生變化,測試代碼有可能需要全部重寫,造成代碼的頻繁修改和引入錯誤的機會。
3.利用 XML 文件配置 Mock 對象
為了改進目前 EasyMock 使用方法中存在的不足,我們需要引入配置文件來對 Mock 對象進行定義。我們的目標是通過配置文件的使用來實現測試代碼和數據的分離。當開發人員因為測試用例的變化而需要改變 Mock 對象的測試行為時,就可以直接對配置文件作出改動,而無需修改測試代碼。
構建 Mock 對象需要以下兩方面的信息:(1)Mock 對象對應的接口或類信息;(2)Mock 對象的預期行為與輸出。如果將以上兩類信息配置在文件中,通過對配置文件的解析來構造 Mock 對象,就可以實現測試代碼和數據分離的目標,從而改進現有 Mock 對象構造方法中的不足。
本文在提出使用配置文件定義 Mock 對象這一機制的同時,也提供了一個基于 EasyMock 的實現。我們將這一實現稱為 XMLEasyMock。XMLEasyMock 的完整實現和相關的測試代碼都可以在 xmleasymock.zip 中找到。如果您使用 Eclipse 作為 IDE,那么您可以將它導入您的 Workspace(如下圖):
圖1:導入 xmleasymock.zip 后的 workspace
在 XMLEasyMock 中,我們選用 XML 文件作為 Mock 對象的配置文件,XML 文件的自定義和結構特性使得它成為描述 Mock 對象最佳的選擇。根據以上對 Mock 對象信息配置的分析,我們可以給出 Mock 對象配置文件的模板:
文章來源于領測軟件測試網 http://www.kjueaiud.com/