【问题标题】:PaxExam tests configured with wrappedBundle()使用 WrappedBundle() 配置的 PaxExam 测试
【发布时间】:2019-02-22 15:01:23
【问题描述】:

对于 PaxExam(第 4 版)中的配置,我们使用wrappedBundle(),您可以在此处看到:

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

因为我们想用一个普通的 jar 创建一个 OSGi 包。

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

features(karafStandardRepo, "wrap"),

问题是在安装wrappedBundle() 时,还没有换行功能。我如何确保在 PaxExam 配置中 wrappedBundle() 仅在 wrap 功能存在并准备好使用后执行?我们在本次测试中使用的 Karaf 发行版是 4.0.7 版。

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

【问题讨论】:

  • 在下一页上提到,在特性 xml 中,您应该使用属性 prerequisite 声明 wrap 特性,但对于测试,我实际上没有特征 xml 文件。那么如何在 PaxExam API 的范围内声明它呢? groups.google.com/forum/#!topic/ops4j/Yx-5AF0Mquo

标签: apache-karaf wiremock pax-exam


【解决方案1】:

是的,确实我们必须将通过 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 中进行封装。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-02
    • 2014-02-04
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    相关资源
    最近更新 更多