我正在使用Pax Exam对我的OSGi应用程序执行集成测试。我有一个配置工厂,我在其中指定要安装在测试容器中的应用程序的Karaf功能,然后修改作为我的功能的一部分安装的.cfg文件的一些属性。
public class TestConfigurationFactory implements ConfigurationFactory {
@Override
public Option[] createConfiguration() {
return options(
karafDistributionConfiguration()
.frameworkUrl(
maven().groupId("org.apache.karaf")
.artifactId("apache-karaf")
.version("3.0.1").type("tar.gz"))
.unpackDirectory(new File("target/exam"))
.useDeployFolder(false),
keepRuntimeFolder(),
// Karaf (own) features.
KarafDistributionOption.features(
maven().groupId("org.apache.karaf.features")
.artifactId("standard").classifier("features")
.version("3.0.1").type("xml"), "scr"),
// CXF features.
KarafDistributionOption.features(maven()
.groupId("org.apache.cxf.karaf")
.artifactId("apache-cxf").version("2.7.9")
.classifier("features").type("xml")),
// Application features.
KarafDistributionOption.features(
maven().groupId("com.me.project")
.artifactId("my-karaf-features")
.version("1.0.0-SNAPSHOT")
.classifier("features").type("xml"), "my-feature"),
KarafDistributionOption.editConfigurationFilePut(
"etc/com.me.test.cfg", "key", "value"));
}
}
我在editConfigurationFilePut
中指定的属性已正确修改,但.cfg文件的其余属性将被删除。如果我使用editConfigurationFilePut
方法编辑Karaf的配置文件之一,它按预期工作(只添加新属性而不修改现有属性)所以我想也许问题是Pax Exam试图修改配置在我的功能安装.cfg文件之前,因此会创建一个新文件来放置该属性。如果是这种情况,有一些方法可以同步此过程,以便仅在正确安装该功能后编辑.cfg文件?
答案 0 :(得分:1)
这有两个不同的原因。 1)在配置文件被编辑后,该功能才会安装。 2)该功能仅包含配置部分而不包含配置文件部分
我认为原因之一是最可能的原因因为它需要运行Karaf才能通过Pax Exam安装功能。因此,要解决原因之一,请使用测试项目中的配置文件替换配置。 原因二,确保该功能实际上引用了配置而不是配置管理配置,或者将配置添加到配置管理服务的配置中。您可以通过在单元测试中注入ConfigAdmin服务并将属性添加到配置pid来实现此目的。
编辑: 结合两种解决方案 由于1)配置文件实际可用需要更长的时间,所以让config-admin服务完成剩下的工作。 确保您的测试通过注入或等待它的可用性来检索config-admin服务。 现在在@Before方法中,确保等到配置完成并从那里更改它。这样您就不需要复制配置文件了。