【问题标题】:Unit-testing servlets [closed]单元测试 servlet [关闭]
【发布时间】:2010-09-08 09:17:01
【问题描述】:

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

【问题讨论】:

  • 我使用 jUnit 在之前启动一个 Jetty servlet 容器,如果之后关闭。

标签: eclipse unit-testing tomcat servlets junit


【解决方案1】:

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 行为的地方),以及针对任何依赖于 JNDI 查找的 servlet 代码。

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • HttpUnit 项目自 2008 年 5 月以来似乎没有任何活动。也许它已经死了?
        【解决方案5】:

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

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

        【讨论】:

        • "2011/08/05 - 雅加达仙人掌已退役。"
        【解决方案6】:

        好的。忽略 '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 类扩展库。但从那时起它会以同样的方式工作。

        【讨论】:

          猜你喜欢
          • 2011-02-03
          • 2013-04-07
          • 1970-01-01
          • 2011-11-07
          • 2010-12-21
          • 2017-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多