如何使用嵌入式Tomcat 7在Junit中测试基于Servlet 3.0注释的Servlet?

3

我希望编写一个junit测试来验证与Servlet 3.0注释(@WebServlet@ServletSecurity)相关的Tomcat 7行为。

目前我有这个测试:

@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,以便使用基于注解的配置。有人能给我一个提示如何构建这样的测试吗?


在tomcat-7.0.8->7.0.11中存在一个bug,@servletSecurity被忽略了。也许你的测试是正确的,你没有任何事情要做,只是触发了这个bug,所以你的测试失败了,正如它应该的那样。http://www.mail-archive.com/users@tomcat.apache.org/msg87337.html - Jean
@Jean:我知道这个 bug,但是我正在使用7.0.11版本。 - Ralph
2个回答

2
我并不完全熟悉Servlet 3.0注解,但我的理解是您需要使用@WebServlet标记一个类,并使用其中之一的@GET@POST等方法进行注释,是这样吗?
如果是这样,那么我认为Servlet类的单元测试不应涉及与上下文、URL路径等相关的内容。如果您的测试正在测试这个逻辑,则您正在测试应用程序服务器的代码和逻辑,而不是您自己的类。
在对@WebServlet进行单元测试时,我会专注于测试处理HTTP请求/响应的方法,并断言给定某些输入(在请求中),您的servlet将返回预期的输出(在响应中)。

1
matt b:我想编写一个测试来验证与Servlet 3.0注释相关的Tomcat 7行为。--我不想测试我的控制器的行为,我想测试@ServletSecurity注释是否起作用。为了做到这一点,我需要一个测试用例,启动服务器尽可能地类似于“真实生活”中的情况,然后尝试访问它。--显然,这不是单元测试,我只会使用JUnit使测试可重复。 - Ralph

1

我不确定这是否解决了问题,但您可以明确将Servlet版本设置为3.0:

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

我不知道这会如何有所帮助? - Ralph
@Ralph 由于您正在使用Servlet 3.0功能,因此应确保您处于Servlet 3.0上下文中。正如我所说,这只是一个想法。 - Sean Patrick Floyd
那很清楚,我已经检查过了,getter返回版本3.0。-- 我相信我需要用类似组件扫描之类的东西来替换addServlet和addServletMapping调用。 - Ralph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接