2013-01-06 49 views
11

我們如何單元測試帶有嵌入式Jetty服務器的servlet?單元測試帶嵌入式Jetty的servlet

例如,如何測試下面的servlet方法?

protected void doGet(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 
    //any logic inside 
} 

回答

14

我非常喜歡使用類似於junit的東西來測試帶有嵌入式jetty實例的servlet以引導它。

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/examples/embedded/src/main/java/org/eclipse/jetty/embedded/MinimalServlets.java

即是如何做到這一點的小例子。

這也是我們如何測試絕大多數碼頭本身,啓動並運行它的步伐。

對於特定的servlet或處理程序,我們經常在我們的jetty-test-helper工件中使用jetty-client或SimpleRequest。 URLConnection也適用。

http://git.eclipse.org/c/jetty/org.eclipse.jetty.toolchain.git/tree/jetty-test-helper/src/main/java/org/eclipse/jetty/toolchain/test/SimpleRequest.java

這裏是在碼頭的客戶端測試,它是碼頭-9,所以如果你想7或8,則相應的標籤下看,它是重構了不少在碼頭-9。

http://git.eclipse.org/c/jetty/org.eclipse.jetty.project.git/tree/jetty-client/src/test/java/org/eclipse/jetty/client/HttpClientTest.java

注:我建議你通過0作爲端口碼頭與啓動,這會給你一個隨機打開的端口,你可以再拉出碼頭用於測試目的的,這樣就避免了這種情況在可能存在端口衝突的CI或並行構建中運行多個構建。

+1

這非常有幫助。但在你的例子中,它並沒有真正顯示我們如何通過向servlet發出請求來測試HelloServlet(或更復雜的東西)。您能否提供一些更多信息? – blue123

0

你不需要碼頭至測試servlet,你需要一個單元測試框架,如JUnit,Mockito,JMock的等

一般來說,你不希望使用當你進行單元測試時,因爲你想將測試集中在正在測試的實際方法上,因此使用碼頭就意味着你也在測試碼頭行爲。完成所有單元測試後,可以繼續進行集成測試和系統測試,並且該部分可能涉及外部系統(如碼頭)(使用自動化框架,如Selenium)。我的單元測試中,您可以查看this code以獲得真實在線服務的實際示例(您可以在此找到here)。 我寫了一篇關於這項服務的教程,它包含了什麼,這可以找到here

[在對此答案不時收到評價後添加]:並且有可能獲得更多的低價贊助,所有低級選手都需要閱讀UNIT TESTING的定義,然後再單擊-1按鈕。你只是不知道你在說什麼。

+0

非常感謝您的回答。但是如果我想在Jetty的幫助下使單元測試更像是一個集成測試呢?我如何測試呢? – blue123

+7

不同意上面的答案,它更好地測試您的servlet在坐在JEE容器中時的行爲方式,因爲這是它在現實生活中的運行方式。更好地瞭解您的代碼在現實生活中的工作方式,而不是模擬對象。 – Jacob

+4

我支持這個答案,這個問題特別提到'單元測試'。如果OP想要運行集成測試,那麼標題是錯誤的。 – maksimov