OSGi服务测试助手:ServiceCollector

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

搭建struts2框架

struts是一个经典的MVC模式拦截器比过滤器拦截的力度更大 搭建struts2框架1.引入lib包 9个(2.3版本的)common-fileupload;common-io;common-lang3;common-logging;freemaker;javassistGA;ognl;struts2-core;xwork-core; 2. struts2.xml3. web.xml将所有的跳转都交给struts2处…

adams与matlab联合仿真天线,雷达天线模型MATLAB与ADAMS联合仿真 实验.doc

雷达天线模型MATLAB与ADAMS联合仿真 实验雷达天线模型MATLAB与ADAMS联合仿真实验1.导入雷达天线机械系统模型启动ADAMS&#xff0c;弹出如图1所示的对话框&#xff0c;选择“Open an existing database”,打开保存雷达天线模型的文件夹X:\antenna_test(注&#xff1a;X表示盘符…

【ACM】nyoj_139_我排第几个_201308062046

我排第几个时间限制&#xff1a;1000 ms | 内存限制&#xff1a;65535 KB 难度&#xff1a;3描述 现在有"abcdefghijkl”12个字符&#xff0c;将其所有的排列中按字典序排列&#xff0c;给出任意一种排列&#xff0c;说出这个排列在所有的排列中是第几小的&#xff1f; …

Apache Cassandra和低延迟应用程序

介绍 多年来&#xff0c; Grid Dynamics拥有许多与NoSQL相关的项目&#xff0c;尤其是Apache Cassandra。 在这篇文章中&#xff0c;我们要讨论一个给我们带来挑战的项目&#xff0c;而我们在该项目中试图回答的问题今天也仍然适用。 数字营销和在线广告在2012年很受欢迎&…

php换设备登录逻辑,登录和退出登录的操作逻辑

登录功能的操作逻辑步骤如下&#xff1a;可以分为五个步骤来实现。1、进入页面先判断用户是否已经登录private void isLogin() {//查看本地是否有用户的登录信息SharedPreferences sp this.getActivity().getSharedPreferences("user_info", Context.MODE_PRIVATE);…

Visual studio代码行数统计

Visual studio代码行数统计 Visual Studio中的搜索功能支持正则表达式&#xff08;虽然语法比较诡异&#xff09;&#xff0c;我们完全可以通过正则表达式来遍历整个解决方案从而获得代码行数。 ^:b*[^:b#/].*$ 需要注意&#xff1a;#开头和/开头或者空行都不计入代码量。 如…

在JAX-RS中处理异步请求中的超时

JAX-RS 2.0在客户端和服务器端都支持异步编程范例。 这篇文章重点介绍了使用JAX-RS&#xff08;2.0&#xff09;API在服务器端执行异步REST请求时的超时功能 无需过多介绍&#xff0c;这里是一个快速概述。 为了以异步方式执行方法&#xff0c;您只需 需要指定AsyncResponse接…

strspn php,php返回在字符串中包含 charlist 参数中指定的字符数目的函数strspn()

实例返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目&#xff1a;<?php echo strspn("Hello world!","kHlleo");?>定义和用法strspn() 函数返回在字符串中包含 charlist 参数中指定的字符数目。提示&#xff1a;请使…

Java十大简单性能优化

关于“ web scale ”这个流行词有很多炒作&#xff0c;人们花了很多时间来重新组织他们的应用程序体系结构&#xff0c;以使其系统“规模化”。 但是什么是扩展&#xff0c;我们如何确保可以扩展&#xff1f; 缩放的不同方面 上面提到的炒作主要是关于扩展负载 &#xff0c;即…

C#_获取汉字拼音

using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; namespace Ctr.Common.Tools {/// <summary>/// 汉字转拼音静态类,包括功能全拼和缩写&#xff0c;方法全部是静态的/// </summary>public static cla…

php在苹果手机上传不了图片大小,ThinkPHP后台上传图片无默认尺寸解决方法

原标题&#xff1a;ThinkPHP后台上传图片无默认尺寸解决方法随着网站移动端的日益普及&#xff0c;对后台数据的兼容性要求也越来越高。后台数据涵盖范围不断扩大的同时&#xff0c;使得程序处理能力也必须逐步提高。使用ThinkPHP进行长沙网站开发时&#xff0c;后台kindeditor…

幂等与时间解耦之旅

HTTP中的幂等性意味着相同的请求可以执行多次&#xff0c;并且效果与仅执行一次一样。 如果用新资源替换某个资源的当前状态&#xff0c;则无论您执行多少次&#xff0c;最终状态都将与您仅执行一次相同。 举一个更具体的例子&#xff1a;删除用户是幂等的&#xff0c;因为无论…

开发者最容易犯的13个JavaScript错误

开发者最容易犯的JavaScript错误&#xff0c;总结出13个。这些当中可能少不了你犯的错误。我们描述了这些陋习&#xff0c;并列出来解决办法&#xff0c;希望对开发者有帮助。 1.for...数组迭代的用法 Usage of for..in to iterate Arrays 举例&#xff1a; var myArray [ “a…

php h2,微信连接失败:一直返回h2Moved/h2 (终于搞定了)

这几天都OK的&#xff0c;可以正常访问&#xff0c;统计数据上只出现过一次访问失败&#xff0c;但是平均耗时增加了30%估计是上次那个心脏滴血事件后&#xff0c;腾讯要求停用SSLv3&#xff0c;必须用TLSv1&#xff0c;但是之前一直没有停止SSLv3的支持&#xff0c;现在真停了…

使用Selenium进行Spring Boot集成测试

Web集成测试允许对Spring Boot应用程序进行集成测试&#xff0c;而无需进行任何模拟。 通过使用WebIntegrationTest和SpringApplicationConfiguration我们可以创建加载应用程序并在普通端口上侦听的测试。 Spring Boot的这一小增加使使用Selenium WebDriver创建集成测试变得更加…

begin ~~~

是时候需要用博客记录自己的code life了~~~ 大二暑假~~~ 需要的tech&#xff1a;php linux j2se ssh asp.net c#winform python htmlcssjsajax svngit转载于:https://www.cnblogs.com/tonyluj/p/3252185.html

在Spring MVC流中使用rx-java Observable

Spring MVC现在已经支持异步请求处理流程了一段时间&#xff0c;该支持内部利用了Tomcat / Jetty等容器的Servlet 3异步支持。 Spring Web Async支持 考虑一下需要花一点时间处理的服务呼叫&#xff0c;该服务呼叫具有延迟&#xff1a; public CompletableFuture<Message&…

宝塔php gd库,宝塔面板安装 EasyImag – 一款最简单图床的安装体验

近日闲逛&#xff0c;发现了一款图床&#xff0c;一款开箱即食的简单图床程序。因为没有数据库所以安装起来也是异常简单&#xff0c;我们看看功能&#xff1a;支持设置图片质量支持仅登录后上传支持QQ截图&#xff0c;剪切板上传支持在线管理(增删改查)支持上传图片转换为指定…

php order by where,无合适where条件过滤时尽量选择order by后的字段以驱动表进行查询...

后台查询语句SELECTo.orders_id,s.orders_status_name,ot.text,af.affiliate_idFROMordersoLEFTJOINorders_totalotON(o.orders_idot.orders_id)LEFTJOINaffilia后台查询语句SELECT o.orders_id, s.orders_status_name, ot.text ,af.affiliate_idFROM orders oLEFT JOIN orders…

零垃圾创建数百万个对象

如性能优化第一规则中所述&#xff0c;垃圾是快速代码的敌人。 通过使用垃圾收集器的服务&#xff0c;它不仅会破坏任何形式的确定性性能&#xff0c;而且我们开始在CPU高速缓存中填充垃圾&#xff0c;这将导致程序的高速缓存未命中。 那么&#xff0c;我们可以在不创建垃圾的…