Arquillian+OSGi+测试不同的框架属性
Arquillian+OSGi+Test Different Framework Properties
我有一个 OSGi 包,它在激活过程中从 Apache Felix 的 config.properties
文件中读取一些属性,如果此配置格式不正确或不存在,则该包不应启动。为此,我正在创建其各自的单元测试,我正在使用 Arquillian 进行测试。当我想为不同的 Arquillian 测试提供不同类型的 conf.properties
以覆盖每个场景时,问题就出现了。
当 Arquillian 运行 进行测试时,它会从 /test/resources/
文件夹加载一个 framework.properties
文件来初始化 Apache Felix,安装测试包和 运行 测试。现在,我的问题是如何为每个测试用例提供不同的 framework.properties
文件?
这是我使用的 Arquillian 单元测试:
@RunWith(Arquillian.class)
public class PersistenceLoaderTest {
@Deployment
public static Archive<?> createDeployment() {
final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "persistence-arq.jar");
archive.addClass(ProviderLoader.class);
archive.setManifest(new Asset() {
public InputStream openStream() {
OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance();
builder.addBundleSymbolicName(archive.getName());
builder.addBundleManifestVersion(2);
builder.addImportPackages("org.osgi.service.startlevel", "org.osgi.service.url");
builder.addImportPackages(ProviderLoader.class);
return builder.openStream();
}
});
return archive;
}
@ArquillianResource
public Bundle bundle;
@ArquillianResource
BundleContext bundleContext;
@Test
public void loadFrameworkConfiguration(){
// What goes here?
}
}
和 framework.properties
文件:
# The Felix Framewok log level
#
# ERROR = 1;
# WARNING = 2;
# INFO = 3;
# DEBUG = 4;
felix.log.level=4
org.domain.database=mydb
org.domain.driver=org.hsqldb.jdbcDriver
org.domain.url=jdbc:hsqldb:file:
org.domain.username=sa
org.domain.password=
这些是 属性 值,我需要针对不同的场景更改和测试它们。
据我了解,这是容器级别的属性,而不是部署级别的属性,因此您需要重新启动容器才能使其生效。
您可以通过将 arquillian.xml 中的容器模式设置为手动来实现此目的。
<arquillian>
<container qualifier="manual_felix" mode="manual">
</container>
</arquillian>
然后在 TestClass 中,您可以注入 ContainerController 并使用每个 运行 的新属性启动它。
@RunWith(Arquillian.class)
public class TestA {
@Deployment(name = "x", managed = false) @TargetsContainer("manual_felix")
public static Archive<?> deployment() {
return ShrinkWrap.create....
}
@ArquillianResource
private ContainerController cc;
@ArquillianResource
private Deployer d;
@Test @InSequence(1)
public void start() {
cc.start("manual_felix", new Config().add("frameworkProperties", "my-custom-properties-file"));
d.deploy("x");
}
@Test @InSequence(2) @OperatesOnDeployment("x")
public void shouldDoSomethingInsideX() {
// executes inside container in context of X
}
}
我有一个 OSGi 包,它在激活过程中从 Apache Felix 的 config.properties
文件中读取一些属性,如果此配置格式不正确或不存在,则该包不应启动。为此,我正在创建其各自的单元测试,我正在使用 Arquillian 进行测试。当我想为不同的 Arquillian 测试提供不同类型的 conf.properties
以覆盖每个场景时,问题就出现了。
当 Arquillian 运行 进行测试时,它会从 /test/resources/
文件夹加载一个 framework.properties
文件来初始化 Apache Felix,安装测试包和 运行 测试。现在,我的问题是如何为每个测试用例提供不同的 framework.properties
文件?
这是我使用的 Arquillian 单元测试:
@RunWith(Arquillian.class)
public class PersistenceLoaderTest {
@Deployment
public static Archive<?> createDeployment() {
final JavaArchive archive = ShrinkWrap.create(JavaArchive.class, "persistence-arq.jar");
archive.addClass(ProviderLoader.class);
archive.setManifest(new Asset() {
public InputStream openStream() {
OSGiManifestBuilder builder = OSGiManifestBuilder.newInstance();
builder.addBundleSymbolicName(archive.getName());
builder.addBundleManifestVersion(2);
builder.addImportPackages("org.osgi.service.startlevel", "org.osgi.service.url");
builder.addImportPackages(ProviderLoader.class);
return builder.openStream();
}
});
return archive;
}
@ArquillianResource
public Bundle bundle;
@ArquillianResource
BundleContext bundleContext;
@Test
public void loadFrameworkConfiguration(){
// What goes here?
}
}
和 framework.properties
文件:
# The Felix Framewok log level
#
# ERROR = 1;
# WARNING = 2;
# INFO = 3;
# DEBUG = 4;
felix.log.level=4
org.domain.database=mydb
org.domain.driver=org.hsqldb.jdbcDriver
org.domain.url=jdbc:hsqldb:file:
org.domain.username=sa
org.domain.password=
这些是 属性 值,我需要针对不同的场景更改和测试它们。
据我了解,这是容器级别的属性,而不是部署级别的属性,因此您需要重新启动容器才能使其生效。
您可以通过将 arquillian.xml 中的容器模式设置为手动来实现此目的。
<arquillian>
<container qualifier="manual_felix" mode="manual">
</container>
</arquillian>
然后在 TestClass 中,您可以注入 ContainerController 并使用每个 运行 的新属性启动它。
@RunWith(Arquillian.class)
public class TestA {
@Deployment(name = "x", managed = false) @TargetsContainer("manual_felix")
public static Archive<?> deployment() {
return ShrinkWrap.create....
}
@ArquillianResource
private ContainerController cc;
@ArquillianResource
private Deployer d;
@Test @InSequence(1)
public void start() {
cc.start("manual_felix", new Config().add("frameworkProperties", "my-custom-properties-file"));
d.deploy("x");
}
@Test @InSequence(2) @OperatesOnDeployment("x")
public void shouldDoSomethingInsideX() {
// executes inside container in context of X
}
}