利用Spring的mock進行單元測試
1.Spring的mock類
Spring框架提供大量測試用的mock類,包括JNDI相關的mock類,Spring portlet相關的mock類,以及Web應用相關的mock類。尤其是Web應用相關的mock類,可以大大提高Web元件測試的便捷性。以下是Spring所提供的Web應用相關的mock類。
²org.springframework.mock.web.MockHttpServletRequest :HttpServletRequest介面的mock實現,用於模擬客戶端的HTTP請求。這是最重要、最常用的mock類。
²org.springframework.mock.web.MockHttpServletResponse
²org.springframework.mock.web.MockHttpSession:HttpSession介面的mock實現,這是一個經常使用的mock類。
²org.springframework.mock.web.DelegatingServletInputStream:ServletInputStream介面的mock實現。
²org.springframework.mock.web.DelegatingServletOutputStream:ServletOutputStream介面的
²org.springframework.mock.web.MockFilterConfig:FilterConfig介面的mock實現。
²org.springframework.mock.web.MockPageContext:JSPPageContext介面的mock實現,通過該類可以測試預編譯的JSP。
²org.springframework.mock.web.MockRequestDispatcher:RequestDispatcher介面的一個mock實現。
²org.springframework.mock.web.MockServletConfig
測試用例中,可以簡單的建立這些mock物件來模擬目的物件。例如HttpServletRequest是一個儲存HTTP引數的元件,而這些引數可用於驅動其他Web元件。MockHttpServletRequest可以直接建立HttpServletRequest介面的例項,並設定其中的引數。在典型的Web元件測試下,可以採用如下方式設定其中的任何引數:
//指定表單方法和請求的URL
MockHttpServletRequest request = new MockHttpServletRequest("POST","/login.do");
//向請求中增加引數
request.addParameter("user","username");
request.addParameter("pass","password");
類似的地,也可以在測試用例中建立HttpServletResponse和HttpSession物件,並設定它們的相關屬性。
2.利用mock類測試控制器
下面是利用mock物件完成控制器測試的原始碼:詳見mockTest
// 該控制器是MultiActionController控制器的delegate類
publicclass SampleDelegate
{
// welcome方法
public ModelAndView welcome( HttpServletRequest req, HttpServletResponse resp)
{
System.out.println("==========" + req.getParameter("method"));
returnnew ModelAndView("/WEB-INF/jsp/welcome.jsp", "model", new Long(System.currentTimeMillis()));
}
// hello方法
public ModelAndView hello( HttpServletRequest req, HttpServletResponse resp)
{
returnnew ModelAndView("/WEB-INF/jsp/hello.jsp", "model", "歡迎學習Spring");
}
}
下面是關於此控制器的配置檔案。配置檔案裡配置了MultiActionController,同時配置了該控制器的delegate。配置檔案如下:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--
ParameterMethodNameResolver -解析請求引數,並將它作為方法名(http://www.sf.net/index.view?testParam=testIt的請求就會呼叫testIt(HttpServletRequest,HttpServletResponse))。使用paramName配置引數可以調整所檢查的引數
InternalPathMethodNameResolver -從路徑中獲取檔名作為方法名(http://www.sf.net/testing.view的請求會呼叫testing(HttpServletRequest, HttpServletResponse)方法)
PropertiesMethodNameResolver -使用使用者定義的屬性物件將請求的URL對映到方法名。當屬性定義/index/welcome.html=doIt,
並且收到/index/welcome.html的請求,就呼叫doIt
-->
<!--配置根據請求名決定控制器-->
<bean id="handlerMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 配置MultiActionController 控制器所需要的引數解析器 -->
<bean id="paramResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
<!-- 確定根據method來決定處理器定向 -->
<property name="paramName">
<value>method</value>
</property>