14

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

4

6 回答 6

9

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

于 2008-09-17T18:06:02.057 回答
6

Spring 框架为 Servlet API 之外的几个类提供了很好的现成模拟对象:

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

于 2008-10-01T15:31:29.963 回答
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 类扩展库。但从那时起它会以同样的方式工作。

于 2008-09-10T06:50:43.017 回答
2

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

  1. 您可以对前两层进行单元测试,而无需任何 servlet 东西;这样测试会更容易。
  2. 正如其他人建议的那样,您可以使用模拟 HTTP 请求和响应对象来测试表示层。
  3. 最后,如果您觉得确实有必要,您可以使用HtmlUnitJWebUnit等工具进行集成测试。
于 2013-06-10T12:19:08.633 回答
1

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

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

于 2008-09-10T07:11:25.743 回答
0

2018 年 2 月更新:OpenBrace Limited 已关闭,不再支持其 ObMimic 产品。

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

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

Its Servlet API objects have no-argument constructors, are fully configurable and inspectable for all relevant Servlet API data and settings, and provide a complete simulation of all of the behaviour specified by the Servlet API's javadoc. To help with testing there's support for selective recording of Servlet API calls, control over any container-dependent behaviour, checks for any ambiguous calls (i.e. where the Servlet API behavour isn't fully defined), and an in-memory JNDI simulation for any servlet code that relies on JNDI lookups.

For full details, example code, "how to" guides, Javadoc etc, see the website.

于 2013-06-27T19:02:33.743 回答