使用wrappedBundle()配置的PaxExam测试

时间:2019-02-22 15:01:24

标签: apache-karaf wiremock pax-exam

对于PaxExam(版本4)中的配置,我们使用wrappedBundle(),如您在此处看到的那样:

wrappedBundle(mavenBundle().groupId("com.github.tomakehurst").artifactId("wiremock-jre8").versionAsInProject()),

因为我们要用普通的jar创建OSGi捆绑包。

然后,为了使用自动换行机制,我们必须安装 wrap 功能:

features(karafStandardRepo, "wrap"),

问题是,当安装wrappedBundle()时,包装功能还不存在。如何确保只有在 wrap 功能可用并且可以使用后,才执行PaxExam配置wrappedBundle()?我们在此测试中使用的Karaf发行版是4.0.7版。

感谢您的帮助, 克拉德拉达奇

1 个答案:

答案 0 :(得分:0)

是的,确实,我们不得不将PaxUrl Wrap机制产生的WireMock捆绑包包装到单独的功能文件中:

<features name="wiremock-${project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.4.0">
    <feature name="wiremock" version="${project.version}">
        <feature prerequisite="true">wrap</feature>
        <bundle>
            wrap:mvn:com.github.tomakehurst/wiremock-jre8-standalone/2.21.0$Bundle-ClassPath=.
        </bundle>
    </feature>
</features>

在这里非常重要的一点是正确配置XML名称空间,即寻址版本 v1.4.0 ,否则prerequisite没有用。我之前遇到的另一个陷阱是没有采用WireMock的独立版本。

然后在PaxExam配置中,我刚刚安装了该功能:

features(maven().groupId("com.company.wiremock").artifactId("wiremock-feature").type("xml").classifier("features").version("1.0.0-SNAPSHOT"), "wiremock"),

在测试中初始化WireMockServer时,为了可以通过ClassLoader.getResource()(该库的内部内容)加载新生成的WireMock-Bundle中的资源,您必须在此处执行此操作进行测试,否则不使用该WireMock-Bundle的Bundle-Classloader:

    @BeforeClass
    public static void setup() {
        ClassLoader savedClassLoader = Thread.currentThread().getContextClassLoader();
        try {
            Thread.currentThread().setContextClassLoader(WireMockClassRule.class.getClassLoader());
            wireMockServer = new WireMockServer(options().dynamicPort());
            wireMockServer.start();
        } finally {
            Thread.currentThread().setContextClassLoader(savedClassLoader);
        }
    }

    @AfterClass
    public static void end() {
        wireMockServer.stop();
    }

您可以将其放在JUnit @ClassRule中进行封装。