另一种测试SampleServlet的方法是在容器本身中运行HttpsServletRequest和 Httpsession对象所在的测试用例。这样就避免了要模拟任何对象的需求,我们可以在真实的容器中访问我们需要的对象和方法。
在我们的示例中,我们需要HttpservletRequest和HttpSession成为由容器管理的真正的对象。采用一种机制来部署和执行在容器中的测试,我们就有了容器内测试。接下来,我们来看看有什么选项可以用来实现容器内测试。
我们有两个构架上的选择来驱动容器内测试:服务器端和客户端。正如我们之前所阐述的那样,我们可以通过控制服务器端的容器和单元测试来直接驱动测试。或者我们能够从客户端来驱动测试,如图8.1所示。
图8.1 一个典型容器内测试的生命周期
一旦测试被打包并部署到容器内和客户端上,那么JUnit的测试运行器就会执行客户端上的测试类。一个测试类通过如HTTP(S)之类的协议来打开一个连接,并且在服务器端调用相同的测试用例。服务器端的测试用例运行
在服务器端对象之上,这些服务器端对象都可以正常使用(如 HttpServletRequest,HttpServletResponse,HttpSession和BundleContext等),并且测试我们的领域对象。服务器将来自测试的结果返回给客户端,该客户端可以由IDE或Ant或Maven获取。
正如你所见,当代码与容器交互并且测试无法创建有效的容器对象(即上一个示例中的HttpServletRequest)时,容器内测试是适用的。
我们的示例使用了一个Servlet容器,但也有许多不同类型的容器:Servlet、数据库、OSGi、SIP 以及其他类似的容器。在以上所有的情况中,我们都可以使用容器内测试策略。在本书的第3部分中,我们介绍了使用这个策略的不同开源项目。表8.1列出了不同类型的容器和我们在后面章节中用到的测试框架。
虽然开源的世界提供了其他的项目,我们在表8.1中列出了最成熟的项目。接下来,我们比较了stub、mock objects和容器内测试这三者。