一、概述
對於Java組件開發者來說,他們都盼望擁有一組能夠對組件開發提供全面測試功能的好用的單元測試。一直以來,與測試獨立的Java對象相比,測試傳統型J2EE Web組件是一項更為困難的任務,因為Web組件必須運行在某種服務器平台上並且它們還要與基於HTTP的Web交互細節相聯系。
易測性(在框架中測試每個組件而不管其具體種類)是Spring框架所提倡的關鍵原則之一。從這一角度看,Spring是對核心J2EE模型的一個重大改進—在以前情況下,在容器外進行組件測試是很難實現的,而且即使是容器內測試也往往要求復雜的安裝過程。
mock測試:就是在測試過程中,對於某些不容易構造或者 不容易獲取的對象,用一個虛擬的對象來創建以便測試的測試方法。這個虛擬的對象就是mock對象。mock對象就是真實對象在調試期間的代替品。
二、Spring Mock類簡介
Mock對象是一個術語,原來主要流行於eXtreme程序員和JUnit小組中。在單元測試上下文中,一個mock對象是指這樣的一個對象——它能夠用 一些“虛構的占位符”功能來“模擬”實現一些對象接口。在測試過程中,這些虛構的占位符對象可用簡單方式來模仿對於一個組件的期望的行為和結果,從而讓你 專注於組件本身的徹底測試而不用擔心其它依賴性問題。
Spring從J2EE的Web端為每個關鍵接口提供了一個mock實現:
MockHttpServletRequest—幾乎每個單元測試中都要使用這個類,它是J2EE Web應用程序最常用的接口HttpServletRequest的mock實現。
MockHttpServletResponse—此對象用於HttpServletResponse接口的mock實現。
MockHttpSession—這是另外一個經常使用的mock對象(后文將討論此類在會話綁定處理中的應用)。
DelegatingServletInputStream—這個對象用於ServletInputStream接口的mock實現。
DelegatingServletOutputStream—這個對象將代理ServletOutputStream實現。在需要攔截和分析寫向一個輸出流的內容時,你可以使用它。
總之,在實現你自己的測試控制器時,上面這些對象是最為有用的。然而,Spring也提供了下列相應於其它不太常用的組件的mock實現(如果你是一個底層API開發者,那么你可能會找到其各自的相應用法):
MockExpressionEvaluator—這個mock對象主要應用於你想開發並測試你自己的基於JSTL的標簽庫時。
MockFilterConfig—這是FilterConfig接口的一個mock實現。
MockPageContext—這是JSP PageContext接口的一個mock實現。你會發現這個對象的使用有利於測試預編譯的JSP。
MockRequestDispatcher—RequestDispatcher接口的一個mock實現,你主要在其它mock對象內使用它。
MockServletConfig—這是ServletConfig接口的一個mock實現。在單元測試某種Web組件(例如Struts框架所提供的Web組件)時,要求你設置由MockServletContext-所實現的ServletConfig和ServletContext接口。
那么,我們該如何使用這些mock對象呢?我們知道,HttpServletRequest是一個持有描述HTTP參數的固定值的組件,而正是這些參數驅 動Web組件的功能。MockHttpServletRequest,作為HttpServletRequest接口的一個實現,允許你設置這些不可改變 的參數。在典型的Web組件測試情形下,你可以實例化這個對象並按如下方式設置其中的任何參數:
//指定表單方法和表單行為
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/main.app");
request.addParameter("choice", expanded);
request.addParameter("contextMenu", "left");
同樣地,你可以實例化並全面地控制和分析HttpResponse和HttpSession對象。接下來,讓我們簡要觀察Spring所提供的特定的JUnit框架擴展。
數據庫連接池技術