Тесты PaxExam, настроенные с помощью wrappedBundle () - PullRequest
0 голосов
/ 22 февраля 2019

Для конфигурации в PaxExam (версия 4) мы используем wrappedBundle(), как вы можете видеть здесь:

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

Поскольку мы хотим создать пакет OSGi из обычного jar.

Тогда, чтобы использовать механизм намотки, мы должны установить функцию wrap :

features(karafStandardRepo, "wrap"),

Проблема заключается в том, что когда дело доходит до установки wrappedBundle() функция намоткиеще не там.Как я могу убедиться, что в конфигурации PaxExam wrappedBundle() выполняется только после того, как функция wrap есть и готова к использованию?Дистрибутив Karaf, который мы используем в этом тесте, является версией 4.0.7.

Спасибо за помощь, Kladderradatsch

1 Ответ

0 голосов
/ 27 февраля 2019

Да, действительно, нам пришлось обернуть генерацию пакета WireMock с помощью механизма PaxUrl Wrap в отдельный файл функций:

<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 в ваших тестах, чтобы ресурсы в новом сгенерированном WireMock-Bundle моглибыть загруженным через ClassLoader.getResource() (внутреннее содержимое этой библиотеки), вы должны сделать это здесь в своем тесте, в противном случае Bundle-Classloader этого WireMock-Bundle не используется:

    @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 для инкапсуляции.

...