使用 Mock 方法能夠模擬協同模塊或領域對象,從而把測試與測試邊界以外的對象隔離開。使單元測試順利進行。然而,Mock 方法在輔助測試的同時,也給開發或測試人員帶來額外的編碼工作。另外,由于 Mock 對象本身并不能對測試數據進行管理,因此測試數據的變動和 Mock 對象本身的變動,可能就會極大的增加編譯和部署的時間。
本文提出一種利用 XML 文件對 Mock 對象進行配置的機制,并在開源項目 EasyMock 的基礎上實現了這種機制。實際上,讀者可以基于任何的自己熟悉的 xMock 項目來實現這里的思想。
1.Mock對象的創建方法
開發和測試人員在利用 Mock 方法進行單元測試時發現,編寫自定義 Mock 對象會帶來大量額外的編碼工作:如果為測試中用到的每一個協同模塊或領域對象手動編寫 Mock 對象,最終的結果將是 Mock 對象的數目隨著系統中實際對象數目的增長而增長。此外,這些為創建 Mock 對象而編寫的代碼也很有可能引入錯誤。
目前,由許多開源項目對動態構建 Mock 對象提供了支持,這些項目能夠根據現有的接口或類動態生成 Mock 對象,從而避免了編寫自定義的 Mock 對象,這樣不僅能減少一定的編碼工作,也可以降低錯誤引入的可能。
EasyMock 就是這些開源框架中的一個,它是一套通過簡單的方法對于給定的接口生成 Mock 對象的類庫。它提供對接口的模擬,能夠通過錄制、回放、檢查三個步驟來完成大體的測試過程。EasyMock 可以驗證方法的調用種類、次數和順序,可以令 Mock 對象返回指定的值或拋出指定異常。通過 EasyMock,開發或測試人員能夠比較方便的創建 Mock 對象,在一定程度上減少了創建 Mock 對象所帶來的工作量。
2.EasyMock 使用示例
EasyMock 的使用方法和原理的詳細說明請參見 "EasyMock 使用方法和原理剖析" 一文。在這里,我們僅以 HttpServletRequest 為例對 EasyMock 的功能做簡單說明。
在部署到 Servlet 容器之前,需要和 HttpServletRequest 進行交互的模塊可以通過構建 Mock 對象的方式進行單元測試。下面是使用 EasyMock(version 2.3)構建 Mock 對象進行簡單測試的例子:
清單1:EasyMock 示例
public class HttpServletRequestUtil {
public static boolean validate(HttpServletRequest request) {
String host = request.getHeader("Host");
return host.startsWith("www.ibm.com");
}
}
public class HttpServletRequestTestCase extends TestCase {
public void testHttpSevletRequest() {
HttpServletRequest mockRequest = createMock(HttpServletRequest.class);
mockRequest.getHeader("Host");
expectLastCall().andReturn("www.ibm.com:80").times(1);
原文轉自:http://www.anti-gravitydesign.com