1. 程式人生 > >利用Spring的mock進行單元測試

利用Spring的mock進行單元測試

1.Springmock

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

HttpServletResponse介面的mock實現,用於模擬伺服器端對客戶端的響應。

²org.springframework.mock.web.MockHttpSessionHttpSession介面的mock實現,這是一個經常使用的mock類。

²org.springframework.mock.web.DelegatingServletInputStreamServletInputStream介面的mock實現。

²org.springframework.mock.web.DelegatingServletOutputStreamServletOutputStream介面的

mock實現,如果需要攔截和分析伺服器的輸出流內容,可以使用該類。

²org.springframework.mock.web.MockFilterConfigFilterConfig介面的mock實現。

²org.springframework.mock.web.MockPageContextJSPPageContext介面的mock實現,通過該類可以測試預編譯的JSP

²org.springframework.mock.web.MockRequestDispatcherRequestDispatcher介面的一個mock實現。

²org.springframework.mock.web.MockServletConfig

ServletConfig介面的一個mock實現。

測試用例中,可以簡單的建立這些mock物件來模擬目的物件。例如HttpServletRequest是一個儲存HTTP引數的元件,而這些引數可用於驅動其他Web元件。MockHttpServletRequest可以直接建立HttpServletRequest介面的例項,並設定其中的引數。在典型的Web元件測試下,可以採用如下方式設定其中的任何引數:

//指定表單方法和請求的URL

MockHttpServletRequest request = new MockHttpServletRequest("POST","/login.do");

//向請求中增加引數

request.addParameter("user","username");

request.addParameter("pass","password");

類似的地,也可以在測試用例中建立HttpServletResponseHttpSession物件,並設定它們的相關屬性。

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>