Как заставить Pax Exam использовать OBR для обработки транзитивных зависимостей?

В Karaf я могу установить функцию OBR и использовать obr:addUrl для добавления repository.xml и obr:deploy для развертывания пакета вместе со всеми переходными зависимостями. Я задокументировал это в /questions/24862473/podderzhivaet-li-karaf-zagruzku-tranzitivnyih-zavisimostej-iz-maven-central/24862492#24862492

Однако теперь я хочу создать тест JUnit с использованием PaxExam, но я не могу подражать тому, что я делал с Karaf на PaxExam.

Любой фрагмент кода, который показал бы, как указать на хранилище OBR и выполнить развертывание со всеми переходными вычислениями, выполненными автоматически?

2 ответа

Решение

Я на самом деле нашел ответ на это некоторое время назад. Я не использую обработчик протокола obr: вместо этого я использую реализацию OBR (Apache Aries).

Вот как я настроил свой тест

@Configuration
public static Option[] configuration() throws Exception {
    return options(
            systemProperty("org.ops4j.pax.logging.DefaultServiceLog.level")
                    .value("WARN"),
            frameworkProperty("obr.repository.url").value(
                    new File("target/dependency/repository.xml").toURI()
                            .toASCIIString()),
            bundle("mvn:org.apache.felix/org.osgi.service.obr/1.0.2"),
            bundle("mvn:org.apache.felix/org.apache.felix.bundlerepository/1.6.6"),
            bundle("mvn:org.apache.aries/org.apache.aries.util/0.4"),
            bundle("mvn:org.apache.aries.proxy/org.apache.aries.proxy/0.4"),
            junitBundles());
}

Затем у меня есть удобный метод в классе для развертывания из OBR с использованием строки поиска OBR

private void obrDeploy(final String filter) throws Exception {
    final Resolver resolver = repositoryAdmin.resolver();
    final Resource[] discoverResources = repositoryAdmin
            .discoverResources(filter);
    for (final Resource r : discoverResources) {
        resolver.add(r);
    }
    assertTrue(resolver.resolve());
    resolver.deploy(true);
}

Тогда мои тесты выглядят так. Это гарантирует, что тесты загружают сервисы, которые он предоставляет правильно.

@Test
public void testBlueprintBundle() throws Exception {
    obrDeploy("(symbolicname=net.trajano.maven-jee6.blueprint.producer)");
    getService(bundleContext, MongoDbFactory.class);
    getService(bundleContext, BlockingQueue.class);
    getService(bundleContext, Executor.class);
}

Обратите внимание, что при этом развертываются только те пакеты, у которых есть транзитивные ссылки, как было задумано. Если у вас есть другие зависимости, которых нет, например, пакеты реализации, их также необходимо развернуть. Ниже приведена строка о том, как развернуть несколько пакетов из OBR с подстановочными знаками, а также упростить тесты.

obrDeploy("(|(symbolicname=*.blueprint.consumer)(symbolicname=*.blueprint.producer)(symbolicname=*.hello.osgi))");

Полный источник находится в https://github.com/trajano/maven-jee6/blob/emerging-technologies/osgi-sample/assembly/src/test/java/net/trajano/osgi/test/PaxTest.java

Вы можете использовать обработчик протокола Pax URL obr: для предоставления отдельных пакетов из репозитория OBR в тесте Pax Exam, но это не приведет к переходным зависимостям.

В Pax Exam вам всегда нужно подготовить каждый пакет отдельно. Но вы можете группировать пакеты по составным параметрам для поддержки повторного использования тестовых конфигураций.

Другие вопросы по тегам