5

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

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

4

3 回答 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());
于 2010-04-03T18:00:14.367 回答
8

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

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

于 2010-04-03T10:09:54.330 回答
6

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

于 2010-04-03T10:25:30.490 回答