我在 DS 中编写了一个 @component,它应该在多个实例中被实例化和激活。为了测试我已经编写了一个 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 中?),因为我的接口 impl 包可以在一段时间后访问配置(当容器关闭时),但它确实应该绑定到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 {
...
}
这是 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";
}
实施:
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 的项目结构和我未能开始工作的测试(直到测试运行后;)。