0

我正在使用 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 文件?

4

1 回答 1

1

这有两个不同的原因。1) 该功能在配置文件被“编辑”后才被安装 2) 该功能只包含一个配置部分而不是一个配置文件部分

我猜一个原因是最可能的原因,因为它需要一个正在运行的 Karaf 来通过 Pax Exam 安装一个功能。因此,要解决原因一,请将配置替换为测试项目中存在的配置文件。原因二,请确保该功能确实引用了配置而不是配置管理员配置,或者将您的配置添加到 config-admin 服务的配置中。您可以通过在单元测试中注入 ConfigAdmin 服务并将您的属性添加到配置 pid 来实现此目的。

编辑:结合两种解决方案因为 1) 配置文件实际可用需要更长的时间,所以让 config-admin 服务完成其余的工作。确保您的测试确实通过注入或等待它的可用性来检索 config-admin 服务。现在在 @Before 方法中确保您等到您的配置完成并从那里更改它。这样您就不需要复制配置文件。

于 2014-05-20T12:28:37.603 回答