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

有帮助吗?

解决方案

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

其他提示

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

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

好的。忽略“tomcat”位和对 servlet 进行编码,最好的选择是为响应和请求对象创建模拟,然后告诉它您期望从中得到什么。

所以对于一个标准的空 doPost ,并使用 易模拟, ,你会有

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

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

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

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

  1. 您可以对前两层进行单元测试,而无需任何 servlet 内容;这样测试会更容易。
  2. 您可以测试表示层, 正如其他人建议的那样, ,使用模拟 HTTP 请求和响应对象。
  3. 最后,如果您觉得确实有必要,您可以使用诸如 html单元 或者 JWebUnit .

对于“容器内”测试,请查看 仙人掌

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

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

如果您想要 ServletUnit 的更新替代品来进行 Servlet 的 JUnit 测试,您可能会找到我公司的 模仿者 图书馆很有用。它可以从网站免费获得 下载 页。

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

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

有关完整详细信息、示例代码、“操作方法”指南、Javadoc 等,请参阅网站。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top