私は実際にこれに対する答えをしばらく前に見つけました。私は 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にあります