Я написал @component в DS, который должен создаваться и активироваться в нескольких экземплярах. Чтобы проверить это, я написал тест на экзамен pax, в котором я загружаю karaf и добавляю scr. Все работает нормально, но... он не будет создавать экземпляры служб до тех пор, пока не будет запущен тестовый метод, поэтому у меня нет места для утверждений и т. д.
@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)".
Привет, Марио
Обновление 3 На самом деле там было две ошибки, одна на моей стороне, а другая где-то еще (в felix CM?), так как конфигурация стала доступной через мой пакет интерфейса через некоторое время (пока контейнер закрывался), но он действительно должен быть привязан к тестовому пакету pax (и, конечно, к самому CM) и никогда не быть «свободным: d», когда контейнер закрывается. Где этот баг я не знаю - я завершу минималистичный проект mvn и попробую ребят из felix cm и выложу сюда обновление.
Обновление 2. Я сообщил об ошибке (https://ops4j1.jira.com/browse/PAXEXAM-725), если кому-то интересно следить за прогрессом (если есть баг ;))
Обновление 1 Это моя конфигурация в тестовом классе
package se.crossbreed.foundation.persistence.provider.couchbase;
@RunWith(PaxExam.class)
@ExamReactorStrategy(PerClass.class)
public class CouchbaseConnectionProviderTests extends CbTestBase {
...
}
Вот конфигурация в тестовом классе, которая будет использовать базовый класс для базовых параметров.
@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";
}
Реализация:
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 Provider и тест, который я не могу заставить работать (пока тест не будет запущен;).