【问题标题】:How to test servlet 3.0 annotations base servlet with an embbedded Tomcat 7 in Junit如何在 Junit 中使用嵌入式 Tomcat 7 测试 servlet 3.0 注释基础 servlet
【发布时间】:2011-03-14 12:34:46
【问题描述】:

我想编写一个 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 中存在一个错误,其中@servletSecurity 被忽略。也许您的测试是正确的并且您无事可做,您只是触发了错误并且您的测试失败了。 mail-archive.com/users@tomcat.apache.org/msg87337.html
  • @Jean:我知道这个错误,但我使用的是 7.0.11。

标签: java unit-testing tomcat servlets


【解决方案1】:

我对 Servlet 3.0 注释并不完全熟悉,但我的理解是,您使用@WebServlet 标记一个类并使用@GET@POST 等之一来注释一个方法,对吗?

如果是这样,那么我认为 servlet 类的单元测试不应该涉及与上下文、URL 路径等相关的任何内容。如果您的测试正在测试此逻辑,那么您正在测试应用程序服务器的代码和逻辑而不是你自己的班级。

@WebServlet 的单元测试中,我会坚持测试处理 HTTP 请求/响应的方法,并断言给定特定输入(在请求中)您的 servlet 返回预期的输出(在响应中)。

【讨论】:

  • matt b:我想写一个测试来验证一个tomcat 7的行为,这与Servlet 3.0注解有关。 -- 我不想测试我的控制器的行为,我想测试@ServletSecurity 注释是否有效。为了做到这一点,我需要一个测试用例来启动服务器,就像它在“真实生活”中所做的那样,然后尝试访问它。 -- 很明显他不是单元测试,我只会用JUnit来让测试可重复。
【解决方案2】:

我不知道这是否能解决问题,但您可以将 servlet 版本显式设置为 3.0:

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

【讨论】:

  • 我不知道这有什么帮助?
  • @Ralph 由于您使用的是 Servlet 3.0 功能,因此您应该确保您处于 Servlet 3.0 上下文中。正如我所说,这只是一个想法
  • 很清楚,我查过了,getter返回3.0版本。 -- 我相信我需要用其他东西替换 addServlet 和 addServletMapping 调用,比如组件扫描等等。
猜你喜欢
  • 2012-07-25
  • 2011-02-02
  • 2011-07-23
  • 1970-01-01
  • 2013-11-21
  • 2017-01-22
  • 2022-01-21
  • 1970-01-01
  • 2012-12-06
相关资源
最近更新 更多