使用 wrappedBundle() 配置的 PaxExam 测试
PaxExam tests configured with wrappedBundle()
对于 PaxExam(第 4 版)中的配置,我们使用 wrappedBundle()
,您可以在此处看到:
wrappedBundle(mavenBundle().groupId("com.github.tomakehurst").artifactId("wiremock-jre8").versionAsInProject()),
因为我们想用普通的 jar 创建一个 OSGi 包。
然后为了可以使用包装机制,我们必须安装 wrap 功能:
features(karafStandardRepo, "wrap"),
问题是安装 wrappedBundle()
包装功能还没有。我如何确保在 PaxExam 配置中 wrappedBundle()
仅在 wrap 功能存在并准备好使用后执行?我们在本次测试中使用的 Karaf 发行版是版本 4.0.7.
感谢您的帮助,
Kladderradatsch
是的,我们确实必须将通过 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
中进行封装。
对于 PaxExam(第 4 版)中的配置,我们使用 wrappedBundle()
,您可以在此处看到:
wrappedBundle(mavenBundle().groupId("com.github.tomakehurst").artifactId("wiremock-jre8").versionAsInProject()),
因为我们想用普通的 jar 创建一个 OSGi 包。
然后为了可以使用包装机制,我们必须安装 wrap 功能:
features(karafStandardRepo, "wrap"),
问题是安装 wrappedBundle()
包装功能还没有。我如何确保在 PaxExam 配置中 wrappedBundle()
仅在 wrap 功能存在并准备好使用后执行?我们在本次测试中使用的 Karaf 发行版是版本 4.0.7.
感谢您的帮助, Kladderradatsch
是的,我们确实必须将通过 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
中进行封装。