Servlet单元测试

5

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

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


可能是单元测试Servlet的重复问题。 - Raedwald
3个回答

18

其中一种最简单的方式是使用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集成吗? - Isabel Jinson
@Thomman:是的。这个类独立于任何测试框架。 - kopper
有趣。其他Servlet测试工具需要端口等。 - Raedwald

8

我建议您将所有业务逻辑从servlet类中移出,放入您自己的类中进行测试。这样,servlet就只是将您的业务逻辑和容器粘合在一起,没有值得测试的内容。

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


谢谢Skaffman,我的servlet处理会话和cookie相关操作。因此,将这些逻辑移动到另一个类中是不可能的。我正在寻找一个允许我在testNG中单元测试servlet的API。 - Isabel Jinson
2
@Thomman:这总是可能的——只需从servlet委托给业务逻辑类即可。没有必须放在servlet中的内容。 - skaffman
虽然这将是集成测试而不是单元测试,但仍可能需要在servlet级别进行测试。 - Raedwald

6
如果可能的话,请遵循skaffman的建议。如果不行,或者您想测试作为前端控制器的servlet的行为,而不是其中的业务逻辑,您可以使用以下工具:

谢谢Bozho,Selenium支持TestNG吗? - Isabel Jinson
是的,Selenium支持TestNG。但我只会在需要并行运行测试时使用它。如果不需要,并且可以使用JUnit,那就坚持使用JUnit。 - djangofan

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