单元测试Servlets

14

我有一堆在Tomcat servlet容器下运行的servlet。我想将测试代码与生产代码分开,因此考虑使用一个测试框架。 JUnit很好地集成到了Eclipse中,但我无法让它使用正在运行的Tomcat服务器运行servlet。请问你能推荐一个支持测试Tomcat servlet的单元测试框架吗?Eclipse集成不是必需的。


我使用jUnit来启动Jetty Servlet容器,然后在之前关闭它。 - Lee Goddard
6个回答

9

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


3
HttpUnit项目似乎自2008-05以来一直没有任何活动。也许它已经停止维护了? - Raedwald

6

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类扩展库。但从那时起,它将以相同的方式工作。


2
将处理HTTP请求和响应的代码部分与业务逻辑或数据库操作的部分分开。在大多数情况下,这将产生一个三层架构,其中包括数据层(用于数据库/持久性)、服务层(用于业务逻辑)和表示层(用于HTTP请求和响应)。
  1. 您可以完全不使用servlet测试前两个层,这样测试会更容易。
  2. 您可以使用模拟HTTP请求和响应对象测试表示层,正如其他人建议的那样。
  3. 最后,如果您觉得确实有必要,您可以使用类似HtmlUnitJWebUnit的工具进行集成测试。

1

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

如果您想在没有运行容器的情况下进行测试,您可以使用自己的模拟对象来模拟其组件(例如使用EasyMock),或者您可以尝试使用MockRunner,它具有用于测试servlet、jdbc连接等的“预定义”存根。


2011/08/05 - Jakarta Cactus已经被淘汰。 - Raedwald

0

2018年2月更新:OpenBrace有限公司已关闭,其ObMimic产品不再受支持。

如果您想要一个新的替代品来进行Servlet的JUnit测试,您可能会发现我们公司的ObMimic库很有用。它可以从网站的下载页面免费获取。

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

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

有关完整细节、示例代码、“如何”指南、Javadoc等,请参阅网站。


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