【问题标题】:Servlet unit testServlet 单元测试
【发布时间】:2011-02-03 23:31:10
【问题描述】:

目前我正在使用 TestNG 框架来测试应用程序的业务逻辑,我最近添加了一些 Servlet 类。

如何在 TestNg 框架中对这些 Servlet 类进行单元测试?

【问题讨论】:

标签: java unit-testing servlets testng mockrunner


【解决方案1】:

最简单的方法之一是来自 Jetty 的ServletTester。一切都是在嵌入式 Jetty 中自动完成的,因此在测试期间没有打开任何端口!如果您使用 Maven,则需要以下工件才能启用此方法:

<dependency>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>jetty-servlet-tester</artifactId>
  <version>6.1.16</version>
  <scope>test</scope>
</dependency>

例子:

准备 ServletTester

ServletTester tester=new ServletTester(); 
tester.addServlet(HelloServlet.class, "/hello"); 
tester.start();

创建 HTTP 请求

HttpTester request = new HttpTester(); 
request.setMethod("GET");
request.setHeader("Host","tester"); 
request.setURI("/hello");
request.setVersion("HTTP/1.0");

调用 servlet 并检索响应:

HttpTester response = new HttpTester();
response.parse(tester.getResponses(request.generate()));

断言您要检查响应的内容及其内容:

assertEquals(200,response.getStatus()); 
assertEquals("Hello Servlet",response.getContent());

【讨论】:

  • @koppernickus:我可以将此测试类与 TestNG 集成吗?
  • @Thomman:是的。此类独立于任何测试框架。
  • 有趣。其他 servlet 测试人员需要端口等。
【解决方案2】:

如果可能,请遵循 skaffman 的建议。如果没有,或者如果您想测试 servlet 作为前端控制器的行为,而不是它们内部的业务逻辑,您可以使用:

【讨论】:

  • 谢谢 Bozho,Selenium 支持 TestNG 吗?
  • 是的,Selenium 支持 TestNG。如果您需要并行运行测试,我只会使用它。如果没有,请坚持使用 JUnit。
【解决方案3】:

我建议您将所有业务逻辑移出 servlet 类,放到您自己的可以测试的类中。这使得 servlet 就像您的业务逻辑和容器之间的粘合剂一样,其中没有任何值得测试的东西。

HttpServletRequestServletConfig 等 API 类是使用您选择的模拟框架(JMock、Mockito 等)的主要目标,因为它们都是接口。

【讨论】:

  • 感谢 Skaffman,我的 servlet 处理会话和 cookie 相关操作。所以将这些逻辑转移到另一个类是不可能的。我正在寻找一个 API,它允许我在 testNG 中对 servlet 进行单元测试。
  • @Thomman:总是有可能的——只需从 servlet 委托给业务逻辑类。 servlet 中没有必须的内容。
  • 仍然需要在 servlet 级别进行测试,尽管那将是集成测试而不是单元测试。
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 2010-09-08
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
相关资源
最近更新 更多