2008-09-10 79 views
14

我有一大堆的Tomcat servlet容器下運行的servlet。我想將測試代碼與生產代碼分開,所以我考慮使用測試框架。 JUnit很好地集成到Eclipse中,但是我沒能使它運行使用運行的Tomcat服務器的servlet。您能否推薦一個支持測試Tomcat servlet的單元測試框架? Eclipse集成很好,但不是必需的。單元測試的servlet

+0

我使用jUnit啓動一個Jetty servlet容器之前,如果關閉之後關閉。 – LeeGee 2014-01-21 16:45:48

回答

9

退房ServletUnit,這是HttpUnit的一部分。簡而言之,ServletUnit提供了一個模擬庫和實用程序庫,您可以在普通的JUnit測試中使用它們來模擬一個servlet容器和其他與servlet相關的對象,如請求和響應對象。上面的鏈接包含示例。

+2

自2008-05以來,HttpUnit項目似乎沒有任何活動。也許它已經死了? – Raedwald 2013-06-10 12:12:04

5

好。忽略'tomcat'位並編碼到servlet,最好的辦法是爲響應和請求對象創建模擬,然後告訴它你期望的結果。

因此,對於一個標準的空doPost方法,以及使用EasyMock,你必須

public void testPost() { 
    mockRequest = createMock(HttpServletRequest.class); 
    mockResponse = createMock(HttpServletResponse.class); 
    replay(mockRequest, mockResponse); 
    myServlet.doPost(mockRequest, mockResponse); 
    verify(mockRequest, mockResponse); 
} 

然後開始添加代碼到doPost方法。嘲笑會失敗,因爲他們沒有期望,然後你可以從那裏設定預期。

注意,如果你想與類使用EasyMock的,你將不得不使用EasyMock的類擴展庫。但從那時起它將以同樣的方式工作。

1

對於「容器內」測試,看看Cactus

如果你想能夠測試不運行的容器,你可以模擬它的組件用自己的mockobjects(與EasyMock如),或者你可以嘗試MockRunner已經「預先定義的」存根測試的Servlet,JDBC的連接等

+0

「2011/08/05 - 雅加達仙人掌已經退役。」 – Raedwald 2013-06-10 12:12:54

2

獨立的那部分代碼邏輯或數據庫操作。在大多數情況下這將產生一個三層結構,具有一個數據層(用於數據基/持久性),服務層(業務邏輯)和表示層(對於HTTP請求和響應)。

  1. 你可以在沒有任何servlet的情況下對前兩層進行單元測試;這樣測試會更容易。
  2. 可以測試表現層,as others suggest,使用模擬HTTP請求和響應的對象。
  3. 最後,如果你覺得它確實是必要的,你可以使用過諸如HtmlUnitJWebUnit集成測試。
0

更新於2018年2月:OpenBrace Limited has closed down,其ObMimic產品不再受支持。

如果您希望ServletUnit的更新替代方案用於Servlet的JUnit測試,您可能會發現我公司的ObMimic庫有用。它可從網站的downloads頁面免費獲得。

與ServletUnit一樣,它提供了一個類庫,您可以在任何Servlet容器之外的常規JUnit或TestNG測試中使用這些類來模擬Servlet API。

它的Servlet API對象具有無參數構造函數,對於所有相關的Servlet API數據和設置都是完全可配置和可檢查的,並且提供了由Servlet API的javadoc指定的所有行爲的完整模擬。爲了幫助測試,支持Servlet API調用的選擇性記錄,控制任何與容器相關的行爲,檢查任何模糊的調用(即Servlet API行爲未完全定義的情況)以及針對任何容器的任何內存JNDI模擬依賴於JNDI查找的servlet代碼。

有關詳細信息,示例代碼,「如何」指南,Javadoc等,請參閱網站。