1

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

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

这可能吗?如果可以,怎么做?它是特定于容器的吗?如果是这样,我正在使用 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 用于演示目的(只是为了表达我的意图)。提前致谢!

4

3 回答 3

2

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

从网页:

Arquillian 将您的测试带到运行时,让您可以访问容器资源、有意义的反馈以及对代码实际工作方式的洞察力。

于 2012-05-31T16:53:45.990 回答
2

我认为你的方法有点错误。您的单元测试伪代码所做的是测试它正确调用您的 ServletContextListener 的容器逻辑 - 我相信容器可以正确执行此操作。

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

于 2012-05-31T17:49:07.383 回答
0

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

编写这种测试用例的最佳方法是:

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