关于eclipse:单元测试servlet

关于eclipse:单元测试servlet

Unit-testing servlets

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


查看ServletUnit,它是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,并使用EasyMock,您将拥有

1
2
3
4
5
6
7
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请求和响应)。

  • 您可以对前两层进行单元测试,而根本不需要任何servlet。这样测试起来会更容易。
  • 正如其他人所建议的,您可以使用模拟HTTP请求和响应对象来测试表示层。
  • 最后,如果您确实有必要,则可以使用HtmlUnit或JWebUnit之类的工具进行集成测试。

  • 对于"容器内"测试,请查看仙人掌

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


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

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

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

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

    有关完整的详细信息,示例代码,"操作方法"指南,Javadoc等,请访问网站。


    推荐阅读