osgi:install_OSGi服务测试助手:ServiceCollector

osgi:install

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:install

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

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

相关文章

塞尔达盾反机器人_微软商店惊现《塞尔达传说:旷野之息》!任天堂暗示《喷射战士3》?| Jump简报...

首先还是祝各位Jumper圣诞快乐&#xff01;业界新闻1. 各大厂商新年寄语&#xff0c;表明未来动向Fami通收到了54家日厂的新年贺卡&#xff0c;其中表明了相当多的新游戏和企划&#xff0c;具体如下&#xff1a;Atlus &#xff1a;《真女神转生V》和《PROJECT Re FANTASY》正在…

PHP 社区拒绝在俄乌冲突中“站队”

点击上方蓝字关注我&#xff0c;了解更多咨询几天前&#xff0c;PHP 社区邮件讨论列表出现了一封“申请援助乌克兰”的邮件&#xff0c;该邮件由非 PHP 开发者发起&#xff0c;目的在于呼吁 PHP 社区火速参与俄乌冲突...邮件机翻译文如下&#xff1a;有意思的是&#xff0c;非 …

放置奇兵最新服务器,放置奇兵开服表

游戏简介&#xff1a;《放置奇兵》是一款全球顶级奇幻RPG手游&#xff0c;派出你的英雄小队&#xff0c;出 发&#xff0c;从碧绿葱葱的萨拉森林到神圣威严的至高天&#xff0c;同数百万玩家一同踏上魔幻旅程&#xff0c;带领你的英雄小队深入古老的废墟&#xff0c;对抗邪恶的…

如何把svn代码拉下来,Maven - 从SVN拉取代码

I am migrating J2ee Project from Ant to Maven,One of The ant tasks is to pull existing source from SVN RepositoryCompile it, and add its jar to my current build as JarIs it possible to do the get the source and compile it in Maven?Thank you!解决方案Yes, i…

jvm内存 大于 xmx_为什么我的JVM访问的内存少于通过-Xmx指定的内存?

jvm内存 大于 xmx“嘿&#xff0c;你能来看看奇怪的东西吗&#xff1f;” 这就是我开始研究支持案例的方式&#xff0c;将我引向了这篇博客文章。 眼前的具体问题与报告可用内存数量不同的不同工具有关。 简而言之&#xff0c;一位工程师正在研究特定应用程序的过多内存使用情…

为什么说PHP是很糟糕的,也是很好的编程语言

点击上方蓝字关注我&#xff0c;了解更多咨询PHP 又是一门相当奇怪的编程语言。当人们抱怨这门语言“很糟糕”时&#xff0c;他们并没有说错。这门语言确实有很多不好的地方。搁在以前&#xff0c;这门语言还有更多糟糕的问题。嘲笑 PHP 的博文《全面解析 PHP 的糟糕设计》(PHP…

中南大学计算机博士读几年,法学院2019年上半年毕业博士生须知

为保证2019年上半年博士生毕业工作顺利开展&#xff0c;根据我校博士生答辩管理的相关文件&#xff0c;现将有关事项通知如下&#xff0c;请遵照执行。1.毕业申请:拟毕业研究生于3月15日前登录“中南大学研究生教育管理信息系统”(以下简称管理系统)&#xff0c;在管理系统个人…

1.0jpa 2.0_JPA 2.1:不同步的持久性上下文

1.0jpa 2.0JPA 2.1版带来了一种新的方式来处理持久性上下文与当前JTA事务以及资源管理器之间的同步。 术语资源管理器来自Java事务处理API &#xff0c;它表示操纵一个资源的组件&#xff08;例如&#xff0c;使用其JDBC驱动程序操纵的具体数据库&#xff09;。 默认情况下&…

vue 保存时清空iuput_vue清空input file

Coding源码学习第四部分&lpar;Masonry介绍与使用&lpar;三&rpar;&rpar;接上篇继续进行Masonry 的学习. (12)tableViewCell 布局 #import "TableViewController.h" #import "Tes ...python 线性回归示例说明:此文的第一部分参考了这里 用python进…

Objective-C学习中对 C语言的扩展

点击上方蓝字关注我&#xff0c;了解更多咨询Objective-C学习中对 C 的扩展是本文要介绍的内容&#xff0c;Objective-C和Cocoa是苹果公司Mac OS X操作系统的核心。Objective-C语言是C语言的一个扩展集&#xff0c;许多具备Mac OS X外观的应用程序都是使用该语言开发的。Cocoa是…

神武4手游服务器维护,神武4手游 本周新手服限服开启 !

《神武4》手游新老玩家互动福利新手服即将于本周在天下无双、二〇二〇、见龙在田限服开启&#xff0c;通过“老带新”模式&#xff0c;助力萌新玩家快乐成长的同时&#xff0c;也为老玩家送出更多福利好礼。【《神武4》手游新手服限服开启 】服务器等级≥65且自身等级≥69级的玩…

@namedqueries_在@NamedQueries中枚举@NamedQuery

namedqueries介绍 如果您是使用JPA的Java开发人员&#xff0c;则很可能在实体上声明了一个或多个NamedQuery对象。 要在类上声明NamedQuery &#xff0c;必须在类中简单地用查询名称及其JPQL进行注释&#xff0c;例如&#xff1a; Entity NamedQuery(name "findAllProj…

ue4 设置intellisence_UE4.22编辑器界面操控设置(4)

视频课程地址&#xff1a;https://i.youku.com/i/UMzE2NDk2OTIw/custom?spma2hzp.8244740.0.0&id32318-在场景中按住鼠标左键上下移动鼠标&#xff0c;摄像机可以在场景中前后移动&#xff0c;左右移动鼠标&#xff0c;在场景中视角会左右旋转。-在场景中按住鼠标右键&…

双向数据绑定是什么

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

织梦网站上传服务器不显示图片,解决织梦后台登陆不显示验证码图片问题

最近在工作中遇到一个问题&#xff0c;用织梦搭建好的网站&#xff0c;在本地上测试没问题但是上传到正式服务器上就出问题了&#xff0c;在后台登陆的时候&#xff0c;验证码的图片老是显示不出来&#xff0c;后来查阅了相关资料才终于找到问题的根本原因&#xff0c;下面就分…

Python与C语言的区别是什么?

点击上方蓝字关注我&#xff0c;了解更多咨询Python与C语言的区别是什么?Python是由C语言实现&#xff0c;C语言是编译型语言&#xff0c;经过编译后生成机器码再运行&#xff0c;执行速度快不能跨平台&#xff0c;一般用于操作系统驱动等底层开发。Python是理解为解释型语言执…

天刀服务器维护时间,6月3日服务器例行维护公告(已完成)

一、重要更新天地风云联赛1、摧毁敌方天芒之塔后除了给本方少侠增加一层士气之外&#xff0c;还会给本方少侠增加一层攻击增益和防御增益。2、击败敌方护卫弓箭手不会给本方少侠增加士气。3、无双之影登场时间提前&#xff1a;比赛还剩15分钟无双之影第一次登场&#xff0c;比赛…

python中可迭代对象拆包时、怎么赋值给占位符_python3-数据结构和算法 » 1.2 解压可迭代对象赋值给多个变量...

1.2 解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时&#xff0c;会抛出一个 ValueError 。 那么怎样才能从这个可迭代对象中解压出 N 个元素出来&#xff1f;解决方案Python 的星号表达式可以用来解决这个问题。比如&#xff0c;你在学习一门课程…

C语言数据类型从计算机原理的角度是怎样看待的?

点击上方蓝字关注我&#xff0c;了解更多咨询初学C语言&#xff0c;首先要接触的就是数据类型了&#xff0c;这也是学习任何一门语言所必须经历的阶段。很多同学在学习的时候不理解数据类型&#xff0c;因为对计算机及原理知之甚少。所以&#xff0c;在学习数据类型之前&#x…

香辣弹簧:不同的自动接线方式

我想展示使用Spring的Autowired批注的不同方式&#xff1a; Constructor &#xff0c; Method和Field自动装配。 我展示的示例都是byType自动装配模式的一种形式&#xff08; constructor自动装配模式类似于byType &#xff09;。 请参阅Spring参考指南 &#xff0c;以获取有关…