单元测试servlet

时间:2008-09-10 06:42:34

标签: eclipse unit-testing tomcat servlets junit

我在Tomcat servlet容器下运行了一堆servlet。我想将测试代码与生产代码分开,所以我考虑使用测试框架。 JUnit很好地集成到Eclipse中,但我没能使用正在运行的Tomcat服务器运行servlet。您能否推荐一个支持测试Tomcat servlet的单元测试框架? Eclipse集成很好但不是必需的。

6 个答案:

答案 0 :(得分:9)

查看ServletUnit,这是HttpUnit的一部分。简而言之,ServletUnit提供了一个模拟库和实用程序库,您可以在普通的JUnit测试中使用它来模拟servlet容器和其他与servlet相关的对象,如请求和响应对象。上面的链接包含示例。

答案 1 :(得分:6)

Spring Framework为Servlet API中的几个类提供了很好的现成模拟对象:

http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/mock/web/package-summary.html

答案 2 :(得分:5)

好。忽略'tomcat'位并编码到servlet,最好的办法是为响应和请求对象创建模拟,然后告诉它你对它的期望。

因此,对于标准的空doPost,并使用EasyMock,您将拥有

public void testPost() {
   mockRequest = createMock(HttpServletRequest.class);
   mockResponse = createMock(HttpServletResponse.class);
   replay(mockRequest, mockResponse);
   myServlet.doPost(mockRequest, mockResponse);
   verify(mockRequest, mockResponse);
}

然后开始向doPost添加代码。模拟会失败,因为他们没有期望,然后你可以从那里设定期望。

请注意,如果要将EasyMock与类一起使用,则必须使用EasyMock类扩展库。但从那时起它将以同样的方式运作。

答案 3 :(得分:2)

将处理HTTP请求和响应的代码部分与执行业务逻辑或数据库操作的部分分开。在大多数情况下,这将产生三层体系结构,包括数据层(用于数据库/持久性),服务层(用于业务逻辑)和表示层(用于HTTP请求和响应)。 / p>

  1. 您可以对前两个图层进行单元测试,而不需要任何servlet内容;这样测试会更容易。
  2. 您可以使用模拟HTTP请求和响应对象来测试表示层as others suggest
  3. 最后,如果您觉得确实有必要,可以使用HtmlUnitJWebUnit进行集成测试。

答案 4 :(得分:1)

对于“容器内”测试,请查看Cactus

如果您希望能够在没有正在运行的容器的情况下进行测试,您可以使用自己的模拟对象模拟其组件(例如使用EasyMock),或者您可以尝试使用“预定义”的MockRunner用于测试servlet,jdbc-connections等的存根。

答案 5 :(得分:0)

2018年2月更新:OpenBrace Limited has closed down,不再支持其ObMimic产品。

如果您想要一个更新的ServletUnit替代方案来测试Servlet的JUnit,您可能会发现我公司的ObMimic库很有用。它可以从网站的downloads页面免费获得。

与ServletUnit一样,它提供了一个类库,您可以在任何servlet容器之外的普通JUnit或TestNG测试中使用它来模拟Servlet API。

它的Servlet API对象具有无参数构造函数,可完全配置并可检查所有相关的Servlet API数据和设置,并提供Servlet API的javadoc指定的所有行为的完整模拟。帮助测试是否支持选择性记录Servlet API调用,控制任何与容器相关的行为,检查任何不明确的调用(即Servlet API行为未完全定义的位置),以及-memory JNDI模拟任何依赖于JNDI查找的servlet代码。

有关详细信息,示例代码,"如何"指南,Javadoc等,请访问网站。