2011-03-14 48 views
3

的測試Servlet 3.0批註基礎的Servlet與embbedded的Tomcat 7我想寫一個JUnit測試來驗證一個tomcat 7的行爲,這是關係到這個Servlet 3.0批註(@WebServlet@ServletSecurity)。如何在JUnit

我到目前爲止是這樣的測試:

@Test 
public void testDoGet() 
    throws ServletException, LifecycleException, IOException {    
    Tomcat tomcat = new Tomcat();   
    tomcat.setPort(8080);   

    Context ctx = tomcat.addWebapp("/", 
    new File("target").getAbsolutePath());    
    Tomcat.addServlet(ctx, "hello", HelloServlet.class.getName()); 
    ctx.addServletMapping("/hello", "hello");  
    tomcat.start(); 

    ByteChunk chunk = new ByteChunk();   
    int responceCode = getUrl("http://127.0.0.1:8080/hello",chunk); 

    System.out.println(responceCode + ": " + chunk.toString()); 

    tomcat.stop(); 
} 

這個測試工作,但它並沒有支付給註釋任何方面。

很明顯,這個測試並沒有對HelloServlet中的註釋給予任何尊重。 但我不知道如何「註冊」一個servlet,以便使用基於註釋的配置。任何人都可以給我一個提示如何建立一個測試,做到這一點?

+0

在tomcat-7.0.8-> 7.0.11中有一個錯誤,其中@servletSecurity被忽略。也許你的測試是正確的,你沒有任何事情要做,你只是觸發錯誤,你測試失敗,因爲它應該。 http://www.mail-archive.com/[email protected]/msg87337.html – Jean

+0

@Jean:我知道這個錯誤,但我使用的是7.0.11。 – Ralph

回答

1

我不知道是否能解決問題,但可以明確設置的servlet版本3.0:

ctx.setEffectiveMajorVersion(3); 
ctx.setEffectiveMinorVersion(0); 
+0

我不知道這應該如何幫助? – Ralph

+0

@Ralph由於您使用的是Servlet 3.0功能,因此您應該確保您處於Servlet 3.0環境中。正如我所說,這只是一個想法 –

+0

很清楚,我已經檢查過,吸氣劑返回版本3.0。 - 我相信我需要用別的東西替換addServlet和addServletMapping調用,就像組件掃描等等。 – Ralph

2

我不完全熟悉了Servlet 3.0批註,但我的理解是,你用@WebServlet標記一個類並用@GET@POST等之一註釋方法,是否正確?

如果是這樣,那麼我不認爲單元測試的servlet類應該涉及任何與上下文,URL路徑等有關的任何東西。如果你的測試正在測試這個邏輯,那麼你正在測試應用程序的代碼和邏輯服務器而不是你自己的班級。

@WebServlet的單元測試中,我會堅持測試處理HTTP請求/響應的方法,並斷言給定某些輸入(請求中)您的servlet返回期望的輸出(在響應中)。

+1

matt b:我想編寫一個測試來驗證tomcat 7的行爲,這與Servlet 3.0的註釋有關。 - 我不想測試我的控制器的行爲,我想測試@ServletSecurity註釋的工作原理。爲了做到這一點,我需要一個測試用例來啓動服務器,就像在「真實生活」中所做的一樣,然後嘗試訪問它。 - 很明顯,他不是一個單元測試,我只會使用JUnit來使測試重複。 – Ralph