單元測試是XP極力推薦的測試驅動開發模式,是保證軟件質量的重要方法。盡管如此,對許多類的單元測試仍然是極其困難的,例如,對數據庫操作的類進行測試,如果不準備好數據庫環境以及相關測試數據,是很難進行單元測試的;再例如,對需要運行在容器內的Servlet或EJB組件,脫離了容器也難于測試。
幸運的是,Mock Object可以用來模擬一些我們需要的類,這些對象被稱之為模仿對象,在單元測試中它們特別有價值。
Mock Object用于模仿真實對象的方法調用,從而使得測試不需要真正的依賴對象。Mock Object只為某個特定的測試用例的場景提供剛好滿足需要的最少功能。它們還可以模仿錯誤的條件,例如拋出指定的異常等。
目前,有許多可用的Mock類庫可供我們選擇。一些Mock庫提供了常見的模仿對象,例如:HttpServletRequest,而另一些Mock庫則提供了動態生成模仿對象的功能,本文將討論使用EasyMock動態生成模仿對象以便應用于單元測試。
到目前為止,EasyMock提供了1.2版本和2.0版本,2.0版本僅支持Java SE 5.0,本例中,我們選擇EasyMock 1.2 for Java 1.3版本進行測試,可以從http://www.easymock.org下載合適的版本。
我們首先來看一個用戶驗證的LoginServlet類:
/**
* LoginServlet.java
* Author: Liao Xue Feng,
*/
package com.javaeedev.test.mock;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// check username & password:
if("admin".equals(username) && "123456".equals(password)) {
ServletContext context = getServletContext();
RequestDispatcher dispatcher = context.getNamedDispatcher("dispatcher");
dispatcher.forward(request, response);
}
else {
throw new RuntimeException("Login failed.");
}
}
}
這個Servlet實現簡單的用戶驗證的功能,若用戶名和口令匹配“admin”和“123456”,則請求被轉發到指定的dispatcher上,否則,直接拋出RuntimeException。
為了測試doPost()方法,我們需要模擬HttpServletRequest,ServletContext和RequestDispatcher對象,以便脫離J2EE容器來測試這個Servlet。
我們建立TestCase,名為LoginServletTest:
public class LoginServletTest extends TestCase {
文章來源于領測軟件測試網 http://www.kjueaiud.com/