Arquillian - 程序化配置

时间:2014-11-20 15:28:32

标签: glassfish testng jboss-arquillian glassfish-embedded

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

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

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 JavaDocs看到org.jboss.arquillian.container.spi.event.container.BeforeStart事件,但我不知道如何听Arquillian事件;
+我已经看到有@Deployment创建ShrinkWrap Descriptor的可能性,但这些不支持Glassfish资源。

1 个答案:

答案 0 :(得分:6)

我在JBoss forum找到了解决我问题的简洁解决方案。您可以注册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);
    }
}

您还需要通过创建文件来配置SPI扩展 META-INF/services/org.jboss.arquillian.core.spi.LoadableExtension
有了这个内容:

com.example.extenstion.AutoDiscoverInstanceExtension