Как получить экземпляр службы OSGi, определенный в blueprint.xml, при написании теста pax-exam?

Я хочу знать, пытался ли кто-нибудь протестировать bean-компоненты/сервисы, представленные через blueprint.xml, работающие в pax-exam с использованием собственного контейнера.

У меня есть проект с двумя пакетами: а) config — классы интерфейса б) config-impl — содержит реализацию и предоставляет bean-компонент как сервис, определенный в blueprint.xml.

Я надеялся, что @Inject в тестовом классе будет аналогичен упомянутому подходу @ https://ops4j1.jira.com/wiki/display/PAXEXAM3/Getting+Started+with+OSGi+Tests должен автоматически устанавливать значение экземпляра в переменной @Inject'ed, но, похоже, это не так. работать.

Варианты, отправленные на pax-exam, вставлены ниже. Не нужно ли загружать больше пакетов, чтобы pax-exam начал распознавать blueprint.xml и запускать службу?

    return options(
            systemProperty("osgi.console").value("6666"),
            junitBundles(),
            provision(
                    mavenBundle("org.osgilab.testing", "commons", "1.0.0"),
                    mavenBundle("org.apache.commons", "com.springsource.org.apache.commons.codec", "1.3.0"),
                    mavenBundle("org.codehaus.jackson", "jackson-core-asl", "1.9.12"),
                    mavenBundle("org.codehaus.jackson", "jackson-mapper-asl", "1.9.12"),
                    mavenBundle("com.umum.container", "container-config", "1.0.0"),
                    mavenBundle("com.umum.container", "container-config-impl", "1.0.0").start()),

            systemProperty("pax.exam.service.timeout").value("160000"), systemTimeout(160000));

person Unic Man    schedule 09.07.2013    source источник
comment
Ваш основной подход к использованию @Inject выглядит хорошо. Можете ли вы опубликовать свой проект или упрощенный проект на github или аналогичном, чтобы мы могли посмотреть?   -  person Christian Schneider    schedule 09.07.2013
comment
Спасибо за быстрый ответ! Я не смогу поделиться реальным кодом. Позвольте мне создать тестовый проект и как-нибудь поделиться им. Дайте мне день или два.   -  person Unic Man    schedule 10.07.2013


Ответы (2)


Я использую следующие системные пакеты:

static Option systemBundles() {
  return composite(
    mavenBundle( "org.apache.aries.blueprint", "org.apache.aries.blueprint", "1.0.0" ),
    mavenBundle( "org.apache.aries", "org.apache.aries.util", "1.0.0" ),
    mavenBundle( "org.apache.aries.proxy", "org.apache.aries.proxy", "1.0.0" ),
    junitBundles(),
    cleanCaches( true ) );
}

Плюс мои собственные пакеты, поэтому мой полный конфиг выглядит примерно так:

@Configuration
Option[] config( ) {
    return options(
      javaFxPackages(),
      systemBundles(),
      mavenBundle( "org.codehaus.groovy", "groovy-all", "2.1.1" ) );
}

Все мои сервисы вводятся корректно. Например, я могу получить службу BundleContext следующим образом:

@Inject BundleContext context;

Надеюсь, это сработает и для вас :)

person Renato    schedule 12.07.2013
comment
Работает на меня! Превосходно! - person snow_leopard; 11.11.2013
comment
Вы также можете делегировать номера версий сборке Maven с помощью mavenBundle("org.apache.aries", "org.apache.aries.util").versionAsInProject(), mavenBundle("org.apache.aries.blueprint", "org.apache.aries.blueprint").versionAsInProject(), mavenBundle("org.apache.aries.proxy", "org.apache.aries.proxy").versionAsInProject() и подключаемого модуля depends: ops4j1.jira.com/wiki/display/paxexam/Pax+Exam+-+Tutorial+1 (см. Учебник 1, занятие 4) - person Jim Bethancourt; 14.01.2014

Pax Exam не волнует, как регистрируются службы OSGi, вы можете использовать Blueprint, Declarative Services или делать это вручную.

Если кажется, что тест не работает, нужно проверить две вещи:

  • Службы вообще зарегистрированы? Используйте консоль/оболочку OSGi для проверки.
  • Включает ли ваша установка Pax Exam все необходимые JAR-файлы?

Собственные интеграционные тесты Pax Exam могут служить примером настройки тестовой среды.

person Harald Wellmann    schedule 09.07.2013
comment
Спасибо за быстрый ответ! Я попытался запустить консоль osgi, используя systemProperty(osgi.console).value(6666) внутри options(..) в модульном тесте на основе pax exam 3.1. Я все еще не могу подключиться к консоли по телнету. Это странно. Вы знаете, как запустить консоль? Я в основном использую собственный контейнер - felix. - person Unic Man; 10.07.2013
comment
Pax Exam не волнует, как регистрируются службы OSGi, вы можете использовать Blueprint, Declarative Services или делать это вручную. -- тестируемый модуль имеет файл blueprint.xml. Что еще требуется для запуска службы вручную? Любой указатель вы можете дать? - person Unic Man; 10.07.2013
comment
С Felix вам нужно подготовить дополнительные пакеты, чтобы получить оболочку (ищите оболочку Gogo). Это основная причина, по которой я предпочитаю Equinox из-за его встроенной оболочки (до 3.7.x). - person Harald Wellmann; 10.07.2013
comment
Я проверю оболочку Gogo. Но у меня есть другой вопрос, как настроить равноденствие. Я вижу все статьи, говорящие об использовании equinox() и все. Но я больше не могу найти его в классе ConfigOptions. - person Unic Man; 11.07.2013
comment
equinox() предназначен только для контейнера Pax Runner Test, функции Pax Exam 2.x, которая была удалена в 3.x. Платформа OSGi выбирается неявно, помещая данную реализацию в путь к классам (используя META-INF/services поиск FrameworkFactory). - person Harald Wellmann; 15.07.2013