osgi:install

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不允许访问当前React堆构建的束,因此请继续关注。

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

osgi:install

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

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

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

  2. OSGi服务测试助手:ServiceRegistrationRule

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

  3. OSGi服务测试助手:ServiceCollector

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

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

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

  5. Android开发测试助手

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

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

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

  7. Dubbo Admin服务测试功能

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

  8. 如何降低微服务测试成本?

    简介:本文为大家介绍微服务治理+测试:基于服务契约信息,降低云上微服务测试成本.如果您的团队具备较强的微服务治理+测试能力,那么希望我们在微服务治理+测试方面的实践和背后的思考,可以为您提供一些参考. ...

  9. 如何降低微服务测试成本?我的经验之谈

    简介: 本文为大家介绍微服务治理+测试:基于服务契约信息,降低云上微服务测试成本.如果您的团队具备较强的微服务治理+测试能力,那么希望我们在微服务治理+测试方面的实践和背后的思考,可以为您提供一些参考 ...

最新文章

  1. 分离颜色通道(split)和多通道融合(merge)
  2. POJ 1018 Communication System
  3. 使用JQuery筛选sharepoint日历里的超链接
  4. 开通域名绑定DDNS
  5. JAVA 条件语句 跟PHP没有区别!!!!!
  6. 2021-01-07 matlab数值分析 线性方程组的迭代解法 高斯-赛德尔迭代法
  7. faster rcnn源码解读(四)之数据类型imdb.py和pascal_voc.py(主要是imdb和roidb数据类型的解说)
  8. php开发微信图灵机器人
  9. Asp.Net 构架(HttpModule 介绍) - Part.3
  10. 最小二乘法进行曲线拟合(Python)
  11. spring5之容器始末源码赏析 (一)总览
  12. LINUX使用C执行系统命令ping,读取执行结果的崩溃日志
  13. 数据通信与计算机网络实训报告,数据通信网络实训总结报告.doc
  14. 企业级网络架构(搭建)学习笔记(网管)
  15. 口算训练 HDU - 6287
  16. 2019年江苏卷数学高考真题Word版含答案解析
  17. 焦作大学计算机专业分数线,焦作大学历年分数线 2021焦作大学录取分数线
  18. 前端失业 3个月,尝试接私单的感触
  19. JavaScript,for循环效率测试,不同遍历循环测试,数组添加效率测试,大数组拼接测试,for循环遍历修改 和 string replace效率
  20. UE4音乐的使用与优化

热门文章

  1. P4587-[FJOI2016]神秘数【主席树】
  2. P3377-[模板]左偏树(可并堆)
  3. jzoj4249-游戏【贪心】
  4. 【模板】最大密度子图
  5. 森近林之助【字符串处理】
  6. 线段树-HDU5737-这题有点神
  7. 数学推导题,NTT,快速数论变换,Wannafly-导数卷积
  8. SpringCloud Zuul(一)之介绍
  9. JS 获取浏览器、显示器 窗体等宽度和高度
  10. 使用GZIP和Zip压缩Java数据流