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 ServiceImpl
implements Service
{
[...]
}
…通过声明性服务注册:
<?xml version="1.0" encoding="UTF-8"?>
<scr:component
xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
immediate="true"
name="Implementation of Service API">
<implementation class="com.codeaffine.example.core.ServiceImpl"/>
<service<
<provide interface="com.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.html