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 version="1.0" encoding="UTF-8"?>
<scr:componentxmlns: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

OSGi服务测试助手:ServiceCollector相关推荐

  1. OSGi服务测试助手:ServiceRegistrationRule

    OSGi服务测试可以有效避免与悬挂的服务引用有关的问题. 就像我在写简单服务贡献验证中所承诺的那样,这次我引入了一个JUnit规则 ,该规则有助于测试组件之间的交互. OSGi服务测试组件交互 假设我 ...

  2. osgi:install_OSGi服务测试助手:ServiceRegistrationRule

    osgi:install OSGi服务测试可以是避免与悬挂的服务引用有关的问题的有效方法. 就像我在写简单服务贡献验证中所承诺的那样,这次我引入了一个JUnit规则 ,该规则有助于测试组件之间的交互. ...

  3. osgi:install_OSGi服务测试助手:ServiceCollector

    osgi:install OSGi服务对于基于松散耦合组件的系统开发非常有用. 但是,松散的耦合可能使得难以识别与悬挂服务引用有关的问题. 因此,我们通常运行集成测试以确保运行时服务组件的可用性. 为 ...

  4. 测试助手健康 Test-AssistantHealth failed for server

    测试助手健康 https://docs.microsoft.com/zh-cn/powershell/module/exchange/test-assistanthealth?view=exchang ...

  5. 基于OSGi的企业级开发框架实践——发布和使用分布式OSGi服务

    随着公司业务的不断扩展,业务人员向IT部门提出了更多的需求,为了快速响应业务人员的需求,尽快的交付成果,码农们日以继夜的将代码往现有系统中不断的堆叠,直到某一天,码农们发现无法再继续往系统上堆叠新的代 ...

  6. Android开发测试助手

    测试:xxx工,你的程序又出bug了!界面切换几下就不行了. 开发:没道理啊,我都测过好几遍了,应该不会 测试:我这复现好几次了. 开发:拉个Log来分析下啦. 测试:拉取日志命令输入中- 日复一日重 ...

  7. android插件化-apkplug中以监听方式获取OSGI服务-09

    2019独角兽企业重金招聘Python工程师标准>>> 我们提供 apkplug 下OSGI使用demo 源码托管地址为 http://git.oschina.net/plug/OS ...

  8. 如何避免让微服务测试成为研发团队最大的瓶颈?

    本文主要为大家介绍微服务测试:基于服务契约信息,降低云上微服务测试成本.该系列文章基于阿里云商业化产品 EDAS 的微服务实践,如果您的团队具备较强的微服务测试能力,那么希望我们在微服务测试方面的实践 ...

  9. Dubbo Admin服务测试功能

    基于Dubbo2.7的元数据,Dubbo Admin实现了服务测试功能,可以通过泛化调用,在控制台上调用真实的服务提供者 使用方式 部署服务提供者: 可以在这里下载demo,此工程基于spring b ...

最新文章

  1. dat关闭某进程_超详细解析!工程师必会的Linux进程间通信方式和原理
  2. 【嵌入式开发】ARM 代码搬移 ( ARM 启动流程 | 代码搬移 起点 终点 | 链接地址 | 汇编代码 )
  3. 腐蚀rust研究台抽奖_超级石化推荐:中石化青岛安工院专家分享延迟焦化装置的腐蚀风险分析!...
  4. 只有2GB内存在20亿个整数中找到出现次数最多的数
  5. 对象的浅克隆与深克隆
  6. 同一个网站下不同应用程序可以不同Framework版本
  7. JSTL-EL表达式 函数fn
  8. linux远程登录 密钥,使用密钥认证机制远程登录Linux
  9. java对象排序_Java™ 教程(对象排序)
  10. HTTP,FTP,SMTP错误码
  11. ubuntu 发布asp.net 站点(.net core)
  12. python字节码解析_简单入门python字节码混淆
  13. 智能陈桥五笔输入法 for linux,在Linux下安装陈桥五笔输入法
  14. Chrome浏览器扩展:bilibili哔哩哔哩视频下载助手 2.1.5_0
  15. 数据通信与计算机网络参考文献,通信工程论文参考文献
  16. firefox插件(plugin)开发概述
  17. 金立(Gionee)金立M7 Power root 大金刚 GN5007 刷机TWRP 面具 XP框架 线刷包
  18. mysql中group by用法解析
  19. 企业即时通讯软件相比传统通讯带来的好处
  20. 积跬步至千里:QUIC 协议在蚂蚁集团落地之综述

热门文章

  1. java实现遍历树形菜单方法——struts.xml实现
  2. Cookie和Session 登录
  3. SparkSQL中UDAF案例分析
  4. js 时间戳转换成时间_JavaScript 时间戳转成日期格式
  5. 如何基于tomcat构建web站点
  6. maven依赖范围_Maven依赖范围
  7. java中接口私有反方_Java 8:在接口中声明私有和受保护的方法
  8. java8 streams_Java 8 Streams API:对流进行分组和分区
  9. java设计模式迭代器模式_迭代器设计模式示例
  10. 基于按位与的 就散策略_比较散列策略