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

OSGi服务测试组件交互

假设我们有一个服务,该服务通知根据whiteboard-pattern绑定的相关观察者。 就像上一篇文章中一样,我们ServiceImpl有一个Service声明和ServiceImpl 。 另外,我们支持ServiceListener ,应在特定操作时通知此服务。

为了表示这样的动作,我们使用名为Service#execute()的方法声明来扩展示例的服务接口:

public interface Service {void execute();
}

除了实现此execute方法之外,贡献类还必须提供绑定和取消绑定ServiceListener引用的功能:

public class ServiceImplimplements Service
{public void execute() {[...]}public void bind( ServiceListener listener ) {[...]}public void unbind( ServiceListener listener ) {[...]}
}

作为通知目的地,回调类型ServiceListener提供了一个称为ServiceListener#executed()的方法声明:

public interface ServiceListener {void executed();
}

要完成设置,我们必须注册服务组件,我们将通过声明式服务再次进行此操作。 请注意附加的0..n参考声明:

<?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><reference bind="bind" unbind="unbind"cardinality="0..n"interface="com.codeaffine.example.api.ServiceListener"name="ServiceListener"policy="dynamic" />
</scr:component>

现在的问题是:我们如何测试监听器的取消绑定/绑定是否正常工作以及是否按预期分派了通知? 基本思想是注册一个ServiceListener 间谍并在实际的服务实现上触发Service#execute

间谍记录了要execute调用,并允许验证绑定和通知是否按预期工作。 一旦确定了这一点,我们就可以继续进行注册并注销主要注册的间谍,并确认没有收到有关后续操作事件的通知。 这样可以确保解除绑定也按计划进行。

但是,这种情况下的测试夹具通常需要一些OSGi样板。 为了减少混乱,我编写了一个小的JUnit规则,该规则可以简化服务注册并在每次测试运行后自动执行服务注册表清理。

服务注册规则

与其他所有JUnit TestRule ,必须在我们的PDE测试 TestRule ServiceRegistrationRule作为公共字段提供。 注意给定测试用例的类实例,规则如何使用参数化的构造函数。 此引用用于获取适当的BundleContext用于服务注销/注册。

@Rule
public final ServiceRegistrationRule serviceRegistration= new ServiceRegistrationRule( getClass() );private ServiceListener listener;
private Service service;@Before
public void setUp() {service = collectServices( Service.class, ServiceImpl.class ).get( 0 );listener = mock( ServiceListener.class );
}

隐式测试安装程序使用我在上 ServiceCollector介绍的ServiceCollector检索正在测试的注册服务 。 使用mockito将侦听器DOC创建为间谍。 上述第一个测试方案如下所示:

@Test
public void executeNotification() {serviceRegistration.register( ServiceListener.class, listener );service.execute();verify( listener ).executed();
}

很简单,不是吗?

请注意, ServiceRegistrationRule负责清理并从服务注册表中删除间谍服务。 为了便于测试解除绑定的情况,规则的register方法返回服务注册的句柄:

@Test
public void executeAfterListenerRemoval() {Registration registration= serviceRegistration.register( ServiceListener.class, listener );registration.unregister();service.execute();verify( listener, never() ).executed();
}

第五行( registration.unregister() )从服务注册表中删除侦听器间谍。 这将触发解除绑定,并且永远不会调用侦听器。 当然,现实世界中的场景可以为多个侦听器注册,异常处理等添加其他测试,但是我认为这个概念已经明确了。

结论

到目前为止, ServiceRegistrationRule在我们当前的项目中证明了自己的作用。 它大大减少了样板,使测试更清洁并提高了可读性。 该类是Xiliary P2存储库的com.codeaffine.osgi.test.util功能的一部分: http ://fappel.github.io/xiliary

如果您想查看代码或提出问题,也可以查看Xiliary GitHub项目: https : //github.com/fappel/xiliary

对于其他所有内容,请随时使用下面的评论部分。 在后续文章中,我将说明如何使用集成的PDE-Tes​​ts来设置Maven-tycho版本。 这有点棘手,因为tycho不允许访问当前反应堆构建的束,因此请继续关注。

翻译自: https://www.javacodegeeks.com/2015/02/osgi-service-test-helper-serviceregistrationrule.html

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

  1. OSGi服务测试助手:ServiceCollector

    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. php发布商品信息逻辑,php – 逻辑思考一个数据库结构:为用户发布的东西添加“标签” – 一个单独的表或……?...
  2. 玩转数据结构从入门到进阶五
  3. 区块链BaaS云服务(12)易居(中国) 房地产 EBaaS(Estate Blockchain as a Service)
  4. 【maven】使用(阿里云 aliyun)镜像仓库
  5. [html] 浏览器是怎么对HTML5的离线储存资源进行管理和加载的
  6. wordpress黑镜2.0作品图片素材类网站模板
  7. 修改environment导致重启不能登录的问题解决
  8. 关于opencv的几个小总结
  9. linux php扩展 mysqli,[linux]PHP添加mysqli扩展 | 学步园
  10. socket编程---SCTP
  11. 被Redis击穿的一次面试经历
  12. JavaScript 中typeof、instanceof 与 constructor 的区别?
  13. xvid-core1.1.2编译方法(vc6,vs2005)
  14. ISO 22301 业务连续性管理(BCM) 认证培训及标准
  15. Ubuntu8.04上用飞信 libfetion
  16. html5自动淡入淡出图片,利用html5实现图片的淡入淡出效果
  17. uni-app 二维码生成(链接转二维码)
  18. oracle分页改写为mysql_mysql和oracle分页
  19. 机器学习——朴素贝叶斯(Naive Bayes)详解及其python仿真
  20. bridge 2021 64位中文版(资源管理器) v11.0.0.83直装版

热门文章

  1. 服务器登陆显示其他用户,连接远程服务器显示其他用户
  2. 亲身体验Intellij Idea从卡顿到顺畅
  3. springboot创建项目 编写dao serviece 和controller 持久层用mybatis
  4. 计算机器内存数量+引入和显示ARDS成员
  5. 使用阿里巴巴json映射_使用JSON模式验证来映射稀疏JSON
  6. 上下文异常中的上下文属性_在没有适当上下文的情况下引发异常是一种不良习惯...
  7. jdbc事务 jta事务_将非事务性资源绑定到JTA事务中的几种模式
  8. jvm 架构_不可变的基础架构,热部署和JVM
  9. java cuba_CUBA平台–新的Java企业应用程序框架
  10. jsp导入jstl标签库_EE JSP:使用JSTL标记库生成动态内容