事业单位建立网站,平面设计师的工作内容,做自己的博客网站,意大利新闻osgi:installOSGi服务对于基于松散耦合组件的系统开发非常有用。 但是#xff0c;松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此#xff0c;我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板#xff0c;我编写了一个简单的实… osgi:install OSGi服务对于基于松散耦合组件的系统开发非常有用。 但是松散的耦合可能使得难以识别与悬挂服务引用有关的问题。 因此我们通常运行集成测试以确保运行时服务组件的可用性。 为了减少此类测试所需的样板我编写了一个简单的实用程序类来获取特定的服务实现。 由于这对其他人也可能有用因此我决定在这篇文章中提供简短的用法说明。 OSGi服务关系 OSGi服务可能依赖或使用其他组件来实现其目的。 在运行的系统中关系网可能会变得非常复杂。 有时可能很难找出为什么应用程序的某些功能无法按预期工作的原因。 例如考虑使用白板模式通知其他组件的组件。 如果观察者之一未能自行注册则不会发生该通知并且可能会破坏相关功能。 尽管此问题的原因可能很简单例如MANIFEST.MF缺少组件声明但可能需要一些时间才能发现它。 因此通过集成测试来防止这些问题似乎是一个好主意。 这些测试将在系统构建过程之后运行在适当的OSGi环境中启动被测捆绑软件并在运行时验证其正确的组件贡献。 为了进行一般的OSGi测试GitHub上有一个OSGi Testing Utils项目。 但是我无法使用此库编写简单的单行代码来从注册表中检索特定的服务实现 。 这就是为什么我写了这篇文章中描述的实用程序类的原因。 但是和往常一样我很愚蠢无法找到合适的解决方案…… 服务收集者 让我们假设我们有一个组件类型Service … // Service API declaration
interface Service {[...]
} …以及提供适当实施类的捆绑包… // Service implementation provided by another bundle
public class ServiceImplimplements Service
{[...]
} …通过声明性服务注册 ?xml version1.0 encodingUTF-8?
scr:componentxmlns:scrhttp://www.osgi.org/xmlns/scr/v1.1.0immediatetrue nameImplementation of Service APIimplementation classcom.codeaffine.example.core.ServiceImpl/serviceprovide interfacecom.codeaffine.example.api.Service//service
/scr:component 为了确保捆绑包实际上成功注册了ServiceImpl实例测试可以在运行时从注册表中检索Service类型的组件并以某种方式过滤我们的特定组件贡献。 原则上这是ServiceCollector功能。 但是我使用扎实的方法仅搜索特定的实现。 尽管在极少数情况下由不同捆绑软件等提供的具有相同实现类型的多个服务在某些情况下可能不是结论性的但对于我们在日常工作中遇到的用例而言这是很直接的。 Test
public void serviceAvailable() {List services collectServices( Service.class, ServiceImpl.class );assertThat( services ).hasSize( 1 );
} 如您所见 ServiceCollector#collectServices将服务声明及其实现类型作为参数以在运行时查找由捆绑包提供的可用服务实例。 由于可能会注册多个与实现类型匹配的服务实例因此它将返回组件列表。 结论 到目前为止 ServiceCollector证明自己在我们当前的项目中非常有用。 在创建新服务时编写与功能性相关的测试之前我们通常要做的第一件事是验证服务的可用性–这是小帮手的事。 但是请再次注意预期用途是每捆服务贡献的集成测试方案。 因此请谨慎使用例如由different包提供的特定实现的多个实例。 这样的情况引起与束相关的测试的不希望的耦合。 ServiceCollector是Xiliary P2存储库的com.codeaffine.osgi.test.util功能的一部分 http ://fappel.github.io/xiliary 如果您想查看代码或提出问题也可以查看Xiliary GitHub项目 https : //github.com/fappel/xiliary 对于其他所有内容请随时使用下面的评论部分。 因此请继续关注–下次我引入该程序包的另一个帮助程序一个对测试服务注册有用的JUnit规则 … 翻译自: https://www.javacodegeeks.com/2015/02/osgi-service-test-helper-servicecollector.htmlosgi:install