我正在使用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资源。
答案 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