如何在单元测试中模拟/存根Java容器?

时间:2012-05-31 16:47:21

标签: java servlets junit glassfish mocking

我有一个实现ServletContextListener的对象,根据Java EE servlet规范,它由servlet容器在部署/启动时通过其contextInitialized(ServletContext)方法调用。

我正在尝试编写一个单元测试来模拟启动和部署ServletContextListener的servlet容器(以便我可以确定应用程序是否正确初始化)。

这可能,如果可行,怎么样?它是特定于容器的吗?如果是这样我正在使用OGS。寻找看起来某事的代码:

@Test
public void shouldBootstrapAppAtDeployTime() {
    // Given
    GlassFishContainer container = new GlassFishContainer(); // ha!
    MyApp app = mock(MyApp.class); // MyApp implements ServletContextListener

    // When - deploy app to container
    // Causes app.contextInitialized(ServletContext) to be called
    container.deploy(app);

    // Then - verify the method was called with any ServletContext
    mock.verify(app.contextInitialized(Matchers.any());
}

这是一个草率的伪代码,其中有一些实施不当的Mockito用于演示目的(只是为了实现我的意图)。提前谢谢!

3 个答案:

答案 0 :(得分:2)

也许你可以用Arquillian解决这个问题:http://arquillian.org/features/

来自网页:

  

Arquillian将您的测试带到运行时,让您可以访问容器资源,有意义的反馈以及有关代码如何工作的见解。

答案 1 :(得分:2)

我认为你的方法有点误。你的单元测试伪代码所做的是测试它正确调用你的ServletContextListener的容器逻辑 - 我会相信容器正确地做了。

我要做的是直接测试你的监听器类,实例化它,使用模拟ServletContext调用contextInitialized()方法(我看到你熟悉Mockito,这是一个很好的工具!),并做你的断言如果你的ServletContextListener按预期完成了它的工作。

答案 2 :(得分:0)

不确定是否有这样的测试框架。即使它存在,它也不在真实环境中进行测试(可能与测试环境不同)。

编写此类测试用例的最佳方法是:

  1. 使用ANT部署战争,您使用的服务器可能提供MBean或部署应用程序的东西
  2. 当调用contextInitialized()方法时,您的侦听器可能正在执行某些功能。
  3. 编写向服务器发出请求的客户端,并检查步骤2是否成功。