您的位置:軟件測試 > 開源軟件測試 > 開源單元測試工具 > junit
基于mock對象和JUnit框架簡化Spring Web組件單元測試
作者:網(wǎng)絡轉(zhuǎn)載 發(fā)布時間:[ 2013/1/4 15:44:09 ] 推薦標簽:

對于Java組件開發(fā)者來說,他們都盼望擁有一組能夠?qū)M件開發(fā)提供全面測試功能的好用的單元測試。一直以來,與測試獨立的Java對象相比,測試傳統(tǒng)型J2EE Web組件是一項更為困難的任務,因為Web組件必須運行在某種服務器平臺上并且它們還要與基于HTTP的Web交互細節(jié)相聯(lián)系。

易測性(在框架中測試每個組件而不管其具體種類)是Spring框架所提倡的關(guān)鍵原則之一。從這一角度看,Spring是對核心J2EE模型的一個重大改進—在以前情況下,在容器外進行組件測試是很難實現(xiàn)的,而且即使是容器內(nèi)測試也往往要求復雜的安裝過程。

本文正是想集中探討Spring的易測性特征—它能使得對Web組件進行單元測試象測試普通Java對象(POJO)一樣容易。

一、Spring Mock類簡介

Mock對象是一個術(shù)語,原來主要流行于eXtreme程序員和JUnit小組中。在單元測試上下文中,一個mock對象是指這樣的一個對象——它能夠用一些“虛構(gòu)的占位符”功能來“模擬”實現(xiàn)一些對象接口。在測試過程中,這些虛構(gòu)的占位符對象可用簡單方式來模仿對于一個組件的期望的行為和結(jié)果,從而讓你專注于組件本身的徹底測試而不用擔心其它依賴性問題。

Spring從J2EE的Web端為每個關(guān)鍵接口提供了一個mock實現(xiàn):

MockHttpServletRequest—幾乎每個單元測試中都要使用這個類,它是J2EE Web應用程序常用的接口HttpServletRequest的mock實現(xiàn)。

MockHttpServletResponse—此對象用于HttpServletResponse接口的mock實現(xiàn)。

MockHttpSession—這是另外一個經(jīng)常使用的mock對象(后文將討論此類在會話綁定處理中的應用)。

DelegatingServletInputStream—這個對象用于ServletInputStream接口的mock實現(xiàn)。

DelegatingServletOutputStream—這個對象將代理ServletOutputStream實現(xiàn)。在需要攔截和分析寫向一個輸出流的內(nèi)容時,你可以使用它。

總之,在實現(xiàn)你自己的測試控制器時,上面這些對象是為有用的。然而,Spring也提供了下列相應于其它不太常用的組件的mock實現(xiàn)(如果你是一個底層API開發(fā)者,那么你可能會找到其各自的相應用法):

MockExpressionEvaluator—這個mock對象主要應用于你想開發(fā)并測試你自己的基于JSTL的標簽庫時。

MockFilterConfig—這是FilterConfig接口的一個mock實現(xiàn)。

MockPageContext—這是JSP PageContext接口的一個mock實現(xiàn)。你會發(fā)現(xiàn)這個對象的使用有利于測試預編譯的JSP。

MockRequestDispatcher—RequestDispatcher接口的一個mock實現(xiàn),你主要在其它mock對象內(nèi)使用它。

MockServletConfig—這是ServletConfig接口的一個mock實現(xiàn)。在單元測試某種Web組件(例如Struts框架所提供的Web組件)時,要求你設(shè)置由MockServletContext所實現(xiàn)的ServletConfig和ServletContext接口。

那么,我們該如何使用這些mock對象呢?我們知道,HttpServletRequest是一個持有描述HTTP參數(shù)的固定值的組件,而正是這些參數(shù)驅(qū)動Web組件的功能。MockHttpServletRequest,作為HttpServletRequest接口的一個實現(xiàn),允許你設(shè)置這些不可改變的參數(shù)。在典型的Web組件測試情形下,你可以實例化這個對象并按如下方式設(shè)置其中的任何參數(shù):

//指定表單方法和表單行為

MockHttpServletRequest request = new MockHttpServletRequest("GET", "/main.app");

request.addParameter("choice", expanded);

request.addParameter("contextMenu", "left");
 

同樣地,你可以實例化并全面地控制和分析HttpResponse和HttpSession對象。接下來,讓我們簡要觀察Spring所提供的特定的JUnit框架擴展。

二、JUnit框架擴展

Spring提供了下列一些特定的JUnit框架擴展:

AbstractDependencyInjectionSpringContextTests—這是一個針對所有測試的超類,其具體使用依賴于Spring上下文。

AbstractSpringContextTests—這是一個針對所有的JUnit測試情形的超類。它使用一個Spring上下文。并且,一般在測試中不是直接使用它,而是使用AbstractDependencyInjectionSpringContextTests或者AbstractTransactionalSpringContextTests這樣的派生類。

AbstractTransactionalSpringContextTests—這是一個針對所有測試的超類,我們一般把它應用在事務相關(guān)的測試中。注意,一旦完成每個測試它會正常地回滾事務;而且你需要重載onSetUpInTransaction和onTearDownInTransaction方法以便手工開始并提交事務。

AbstractTransactionalDataSourceSpringContextTests—這是AbstractTransactionalSpringContextTests的一個子類,它使用了Spring的基于JDBC的jdbcTemplate工具類。

所有上面這些擴展將極大程度地簡化在測試時對于相關(guān)操作的依賴性注入和事務管理。

上一頁12下一頁
軟件測試工具 | 聯(lián)系我們 | 投訴建議 | 誠聘英才 | 申請使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd