10

我正在使用 Arquillian 和使用 TestNG 的嵌入式 glassfish 3.1.2.2 编写集成测试。我希望能够并行运行这些测试,对于这种情况,我需要动态配置 glassfish 端口和数据库名称(我们已经有了这个设置,我想在 arquillian 测试中重用它)。我缺少的是一个“容器启动前”挂钩,我可以在其中准备数据库、查找空闲端口并更新我的 glassfish 配置(domain.xml,也可以是 glassfish-resources.xml)。是否有一个“干净”的解决方案,或者 Arquillian 开发人员没有预见到我的用例?

我目前解决它的黑客方法是覆盖 arquillian 的 beforeSuite 方法,但是这个方法被调用了两次——在测试启动时,然后在容器中(因此我可怜的静态标志)。其次,该解决方案不适用于基于 JUnit 的测试,因为无法拦截 arquillian 的 before 套件:

public class FullContainerIT extends Arquillian {

    private static boolean dbInitialized;

    //@RunAsClient <-supported by @Test only
    @Override
    @BeforeSuite(groups = "arquillian", inheritGroups = true)
    public void arquillianBeforeSuite() throws Exception {
        if (dbInitialized == false) {
            initializeDb();
            dbInitialized = true;
        }
        super.arquillianBeforeSuite();
    }
}

我有一些想法:
+@BeforeSuite @RunAsClient似乎是我需要的,但@RunAsClient仅支持@Test
+ 我在Arquillian JavaDocsorg.jboss.arquillian.container.spi.event.container.BeforeStart中看到过事件 ,但我不知道如何收听 Arquillian 事件; + 我看到有可能创建一个ShrinkWrap Descriptor,但这些不支持 Glassfish 资源。
@Deployment

4

1 回答 1

8

我在JBoss 论坛上为我的问题找到了一个干净的解决方案。您可以注册一个 LoadableExtension SPI 并修改 arquillian 配置(从 xml 加载)。这是我可以创建数据库并使用适当值过滤 glassfish-resources.xml 的地方。设置如下所示:

package com.example.extenstion;

public class AutoDiscoverInstanceExtension 
                 implements org.jboss.arquillian.core.spi.LoadableExtension {

    @Override
    public void register(ExtensionBuilder builder) {
        builder.observer(LoadContainerConfiguration.class);
    }
}

package com.example.extenstion;

public class LoadContainerConfiguration {

    public void registerInstance(@Observes ContainerRegistry, ServiceLoader serviceLoader) {

        //Do the necessary setup here
        String filteredFilename = doTheFiltering();

        //Get the container defined in arquillian.xml and modify it
        //"default" is the container's qualifier 
        Container definition = registry.getContainer("default");
        definition.getContainerConfiguration()
                .property("resourcesXml", filteredFilename);
    }
}

您还需要通过创建
META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
包含以下内容的文件来配置 SPI 扩展:

com.example.extenstion.AutoDiscoverInstanceExtension
于 2014-11-24T15:11:07.610 回答