2015-07-07 6 views
1

Я написал @компонент в DS, который предполагается создать и активировать в нескольких экземплярах. Чтобы проверить, что я написал экзамен по экзамену pax, где я загружаю karaf и добавил scr. Все работает отлично, но ... это не будет создавать экземпляры служб, пока метод испытания закончились, таким образом, не дает мне никакого места, чтобы делать утверждения и т.д.Конфигурация Admin и декларативные службы, не созданные во время фазы тестирования экзамена pax

@Test 
public final void testing() throws Exception { 
props = createProperties(user, pass, host); 
cfg = configurationAdmin. 
    createFactoryConfiguration(CouchbaseConnectionProvider.SVC_NAME); 
cfg.update(props); 

final ServiceTracker tracker = new ServiceTracker(bundleContext, CouchbaseConnectionProvider.class, null); 
tracker.open(); 

CouchbaseConnectionProvider svc = (CouchbaseConnectionProvider) tracker.waitForService(5000); 
// It will wait 5s and after testing exits it will create the service 
} 

Что я здесь делаю неправильно? С момента выхода метода он будет правильно создавать и активировать услугу со всеми свойствами.

Могу добавить, что метод испытаний с использованием нити «ion (3) -127.0.0.1» и когда DS создает экземпляр использует поток «84-b6b23468b652» ».

Приветствия, Марио

Update 3 Там, где на самом деле две ошибки, одна на моей стороне и один в другом месте (в ФЕЛИКС CM?), Так как конфиг где доступ к которой мой интерфейс осущ расслоение через некоторое время (в то время как контейнер закрывался), но он должен быть действительно привязан к пакету тестирования pax (и, конечно же, к CM) и никогда не был «свободным: d», когда контейнер закрывался. Где это ошибка, я не знаю - я завершу минималистский проект mvn и попробую парней felix cm, и я опубликую здесь обновление.

Update 2 Я подал ошибку (https://ops4j1.jira.com/browse/PAXEXAM-725), если кто-то заинтересован, чтобы следить за прогрессом (если есть ошибка;))

Update 1 Это моя конфигурация в TestClass

package se.crossbreed.foundation.persistence.provider.couchbase; 

@RunWith(PaxExam.class) 
@ExamReactorStrategy(PerClass.class) 
public class CouchbaseConnectionProviderTests extends CbTestBase { 
    ... 
} 

Вот конфигурация в TestClass, который будет использовать базовый класс для вариантов базовых.

@org.ops4j.pax.exam.Configuration 
public Option[] config() { 
    List<Option> options = super.baseConfig(); 
    options.addAll(Arrays 
      .asList(features(karafStandardRepo, "scr"), 
        mavenBundle() 
          .groupId("se.crossbreed.foundation.persistence") 
          .artifactId(
            "se.crossbreed.foundation.persistence.core") 
          .versionAsInProject(), 
        mavenBundle().groupId("io.reactivex") 
          .artifactId("rxjava").versionAsInProject(), 
        mavenBundle() 
          .groupId("se.crossbreed.ports.bundles") 
          .artifactId(
            "se.crossbreed.ports.bundles.couchbase.java-client") 
          .versionAsInProject(), 
        mavenBundle() 
          .groupId("se.crossbreed.foundation.persistence") 
          .artifactId(
            "se.crossbreed.foundation.persistence.provider.couchbase") 
          .versionAsInProject())); 

    // above bundle is the one I'm trying to test and where 
    // this test resides in (project wise) 
    return options.toArray(new Option[] {}); 
} 

Базовая конфигурация получается из базового класса

protected List<Option> baseConfig() { 
    return new ArrayList<Option>(
      Arrays.asList(new Option[] { 
        logLevel(LogLevel.INFO), 
        karafDistributionConfiguration().frameworkUrl(karafUrl) 
          .unpackDirectory(new File("target", "exam")) 
          .useDeployFolder(false), 
        configureConsole().ignoreLocalConsole(), 
        mavenBundle().groupId("biz.aQute.bnd") 
          .artifactId("bndlib").version("${version.bndlib}"), 
        mavenBundle() 
          .groupId("se.crossbreed.foundation") 
          .artifactId(
            "se.crossbreed.foundation.core.annotations") 
          .versionAsInProject(), 
        mavenBundle() 
          .groupId("se.crossbreed.foundation") 
          .artifactId(
            "se.crossbreed.foundation.core.interfaces") 
          .versionAsInProject() })); 
} 

Пакет для теста

package se.crossbreed.foundation.persistence.provider.couchbase; 

И CouchbaseConnectionProvider находится на том же пакете

package se.crossbreed.foundation.persistence.provider.couchbase; 

import se.crossbreed.foundation.persistence.core.CbDbConnectionProvider; 

public interface CouchbaseConnectionProvider extends CbDbConnectionProvider { 
    public final static String SVC_NAME = "couchbase.connection.provider"; 
} 

ntation:

package se.crossbreed.foundation.persistence.provider.couchbase.impl; 

@Component(immediate = true, name = 
    CouchbaseConnectionProvider.SVC_NAME, provide = { 
    CouchbaseConnectionProvider.class, CbDbConnectionProvider.class, 
    CbService.class }, properties = { "providerType=DOCUMENT" }, 
    configurationPolicy = ConfigurationPolicy.require) 
    public class CouchbaseConnectionProviderImpl implements 
    CouchbaseConnectionProvider { ... } 

Вот структура проекта Поставщика Couchbase и тест, который я неисправного чтобы добраться до работы (пока после испытания закончились;).

Project Structure of the couchbase provider and the test

ответ

0

благодарит вас обоих за ваш вклад - я решил ответить на этот вопрос сам, так как я была ошибка в моем коде и получил помощь от Кристофа.

Я цитирую ответ от него здесь, если кто-то другой сделал то, что я сделал.

Проблема заключалась в том, что я не установил право собственности на конфигурацию как анонимное через (pid, null) в createFactoryConfiguration. Вместо этого я использовал createFactoryConfiguration (pid), затем он привязался к текущему исполняющему пакету, а не к набору, который я тестировал. Как объяснил Кристоф, для меня было возможно получить расположение пакета в комплекте и установить его явно.

Cheers, Марио

Вот Christoph Läubrich ответ

«добавил Christoph Läubrich комментарий - 13 минут назад

Хорошо, я думаю, я знаю, что может быть проблема в настоящее время: Вы используете createFactoryConfiguration (java.lang.String factoryPid), это означает, что вы создадите конфигурацию, которая эксклюзивно связана с вашим пакетом! Таким образом, ни один другой пул не может получить доступ к конфигурации! Используйте createFactoryConfiguration (java.lan g.String factoryPid, java.lang.String location) вместо этого с нулевым аргументом для местоположения! Таким образом вы создаете анонимную конфигурацию, которая будет привязана к первому пакету, который извлекает эту конфигурацию. Альтернативно вы можете получить местоположение целевого пакета и явно передать это как параметр, но это часто не требуется. Если это по-прежнему не работает, мы должны более внимательно изучить вашу конфигурацию, подключиться к оболочке karaf (пока остановлен в точке останова) и получить список всех пакетов (список: список) и список всех компонентов (scr :список). Также вы должны собрать подробную информацию о комплекте зонда и комплекте, который должен предоставить услугу (пакеты: импорт). »

+0

Или, скорее, я сделал то, что я использую правильное расположение пакета, так как это то, что нужно, а не первый захват ... cheers/mario –

0

Я подозреваю, что тест развертывает интерфейс CouchbaseConnectionProvider с самим собой. Таким образом, вы пытаетесь получить услугу с использованием другого интерфейса, чем тот, который предоставляет реальный сервис.

Вам следует попытаться добавить импорт и экспорт в тестовый комплект для пакета CouchbaseConnectionProvider.

Для этого используйте ProbeBuilder

@ProbeBuilder 
public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) { 
    probe.setHeader(Constants.IMPORT_PACKAGE, ".."); 
    probe.setHeader(Constants.EXPORT_PACKAGE, ".."); 
    return probe; 
} 
+0

Спасибо! :) - Теперь я понимаю, что вы пытаетесь мне рассказать - да тест находится в тестовая папка в том же проекте, что и мой src/main/java для интерфейса (и реализации). Если сбой службы слежения - мне было бы хорошо, но моя проблема в том, что DS не будет * даже создавать или активировать мою службу (см. обновленный вопрос :)) .Это будет делать это после завершения тестового метода и закрытия контейнера (тогда он будет создан). –

+0

Это было моей ошибкой, привязало конфигурацию к текущему исполняющему пакету, опустив расположение пакета в createFactoryConfiguration - спасибо за вашу помощь! –

+0

Замечательно, что вы получили его –

1

(я на самом деле не вижу ничего плохого в вашем коде, ConfigurationAdmin должен работать асинхронно. Новая услуга пришедшего после испытания по-прежнему выглядит как вопрос синхронизации ., хотя в этом случае, эта установка может исправить)

Вместо создания конфигурации внутри метода тестирования вы можете использовать Pax-экзамен-см, чтобы создать заводскую конфигурацию с другими вариантами:.

@org.ops4j.pax.exam.Configuration 
public Option[] config() { 
    List<Option> options = super.baseConfig(); 
    options.addAll(Arrays 
     .asList(features(karafStandardRepo, "scr"), 
     //missing conversion: putAll() needs a Map   
     ConfigurationAdminOptions.factoryConfiguration(CouchbaseConnectionProvider.SVC_NAME) 
         .putAll(createProperties(user, pass, host)).create(true).asOption(), 
       mavenBundle() 
         .groupId("se.crossbreed.foundation.persistence") 
         .artifactId(
           "se.crossbreed.foundation.persistence.core") 
         .versionAsInProject(), 
       mavenBundle().groupId("io.reactivex") 
         .artifactId("rxjava").versionAsInProject(), 
       mavenBundle() 
         .groupId("se.crossbreed.ports.bundles") 
         .artifactId(
            "se.crossbreed.ports.bundles.couchbase.java-client") 
         .versionAsInProject(), 
       mavenBundle() 
         .groupId("se.crossbreed.foundation.persistence") 
         .artifactId(
           "se.crossbreed.foundation.persistence.provider.couchbase") 
         .versionAsInProject())); 

    // above bundle is the one I'm trying to test and where 
    // this test resides in (project wise) 
    return options.toArray(new Option[] {}); 
} 

настройки Maven:

<dependency> 
    <groupId>org.ops4j.pax.exam</groupId> 
    <artifactId>pax-exam-cm</artifactId> 
    <version>${exam.version}</version>     
</dependency> 

Вы можете также просто использовать @Inject аннотацию, чтобы получить CouchbaseConnectionProvider внутри теста.

@Inject 
CouchbaseConnectionProvider svc; 
+0

Спасибо за помощь в AdminOptions! Да, я могу сказать, что он опубликовал его async (я бы предположил, что DS - один из слушателей). Однако кажется, что во время теста его поток ждет. Это ошибка, сообщаемая PAX? Этот случайный случай - однако причина, по которой у меня есть экземпляр в моем методе тестирования, заключается в том, что я могу проверить его с другой зависимостью службы (в рамках couchbaseconnectionprovider) и как он активирован и деактивирован (надеюсь, правильно). В этой настройке это невозможно сделать. –

+0

Спасибо за помощь! На самом деле это была моя ошибка, я не предоставил правильного владельца для конфигурации (пропущенный нуль или правильное расположение пакета для моего пакета поставщиков гибридов). Единственная тайна для меня - это то, почему в мире сервис был создан на более позднем этапе, так как у него не было конфига ... странно - но еще раз спасибо! :) cheers/mario –