1. 程式人生 > >Spring學習12-Spring利用mock進行單元測試

Spring學習12-Spring利用mock進行單元測試

一、概述 
 對於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框架擴充套件。
資料庫連線池技術