对于osgi bundle的集成测试研究

    由于OSGI技术优秀的模块化技术分离,在不同的bundle之间进行交互的方式有两种:一是包(package)的导出和导入,二是bundle向外部发布service。第二种方式是osgi中推荐的方式,同时这种方式具有SOA的特点。但是,这种模块化的组织方式,特别是通过服务在不同的bundle间进行交互,使得osgi环境中的测试,必须在osgi container中进行,增加了测试环境搭建的难度。    在spring dm中,提供了一种启动osgi container的方式,通过springdm、osgi container、junit的组合,进行osgi的集成的测试。但是这种方式的设置比较复杂,特别是对于每一个bundle到要在测试程序和pom中设置,容易引起错误。

    因此,基于对OSGI container的分析(主要是Felix和Equinox),可以通过在传统的程序中,嵌入(embedded)一个osgi的环境,可以利用Junit象测试普通的java程序一样测试bundle提供的service。

  一、建立一个OSGI的嵌入环境

    这里以建立Felix的嵌入式环境为例子进行解释,对于Equinox的环境,基本的建立方法相同。在建立Osgi环境过程中,关键的问题有两个:一是对于OSGI 环境配置文件的读取和处理,并把它设置到启动的嵌入式环境中;二是对于自动启动的bundle的读取和启动。工程的目录结构如图所示:

    首先是对于Felix配置文件的处理, 读取配置文件config.properties,并把读入的内容加载到Properties中。

    	InputStream input = null;
    	try {
			input = new FileInputStream("conf/config.properties");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

    	Properties props = new Properties();
    	try {
			props.load(input);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

 

其次是读取自动启动的bundles,放在工程的bundles目录下,子目录以数字命名,对应于Felix中bundle的启动级别,在Felix中,对于自动启动的bundle的设置属性为:"felix.auto.start",通过程序中读取这个目录下的bundle,设置到properties:

		File dir = new File("bundles");
		String[] list = dir.list();

		for(int i= 0;i< list.length;i++)
		{

			File jarDir = new File("bundles/"+list[i]);
			
			

			String runJars =  this.getFileName(" file:", jarDir);

			props.setProperty(AUTO_START_PROP+"."+list[i], runJars);
		}

   private String getFileName(String rootPath,File file)
    {
     String bundlesPath="";
     
     if(!file.getAbsolutePath().contains(".svn"))
     {
      if(file.isDirectory())
      {
       String[] files = file.list();
       
       for(int i=0;i<files.length;i++)
       {
        bundlesPath = bundlesPath+getFileName(rootPath,new File(file.getPath()+"/"+files[i]));
       }
       
      }
      else
      {
       bundlesPath=rootPath+file;
      }
     }
     return bundlesPath;
    }
  

最终,把完整的属性设置传给Felix,然后以嵌入式方式启动OSGI环境。完整的Felix Host代码如下:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import org.apache.felix.framework.Felix;
import org.apache.felix.main.AutoProcessor;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;


public class FelixHostApplication
{
 //    private HostActivator m_activator = null;

    private static  Felix m_felix = null;
    private final String AUTO_START_PROP ="felix.auto.start";

    public Object getBunndleContext()
    {
    	return m_felix.getBundleContext();
    }
    
    private String getFileName(String rootPath,File file)
    {
    	String bundlesPath="";
    	
    	if(!file.getAbsolutePath().contains(".svn"))
    	{
	    	if(file.isDirectory())
	    	{
	    		String[] files = file.list();
	    		
	    		for(int i=0;i<files.length;i++)
	    		{
	    			bundlesPath = bundlesPath+getFileName(rootPath,new File(file.getPath()+"/"+files[i]));
	    		}
	    		
	    	}
	    	else
	    	{
	    		bundlesPath=rootPath+file;
	    	}
    	}
    	return bundlesPath;
    }
    

    public FelixHostApplication()
    {
    	InputStream input = null;
    	try {
			input = new FileInputStream("conf/config.properties");
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

    	Properties props = new Properties();
    	try {
			props.load(input);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		File dir = new File("bundles");
		String[] list = dir.list();

		for(int i= 0;i< list.length;i++)
		{

			File jarDir = new File("bundles/"+list[i]);
			
			

			String runJars =  this.getFileName(" file:", jarDir);

			props.setProperty(AUTO_START_PROP+"."+list[i], runJars);
		}



        // Create a configuration property map.
        Map config = new HashMap(props);
        // Create host activator;
 /*       m_activator = new HostActivator();
        List list1 = new ArrayList();
        list1.add(m_activator);
        config.put(FelixConstants.SYSTEMBUNDLE_ACTIVATORS_PROP, list1);
*/

       try
        {
            // Now create an instance of the framework with
            // our configuration properties.
            m_felix = new Felix(config);

            m_felix.init();
            AutoProcessor.process(config, m_felix.getBundleContext());

 //          m_felix.getBundleContext().registerService(ShareInterface.class.getName(), new ShareImpl(), null);


           // Now start Felix instance.
            m_felix.start();

            Thread.sleep(10*1000);

            System.out.println("hello");

        }
        catch (Exception ex)
        {
            System.err.println("Could not create framework: " + ex);
            ex.printStackTrace();
        }
    }

  public Bundle[] getInstalledBundles()
    {
        // Use the system bundle activator to gain external
        // access to the set of installed bundles.
        return this.m_felix.getBundleContext().getBundles();
    }

    public void shutdownApplication()
    {
        // Shut down the felix framework when stopping the
        // host application.
        try {
			m_felix.stop();
		       m_felix.waitForStop(0);
		} catch (BundleException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    }
}

 

 二、在Junit Test Case中启动OSGI 环境

    建立一个Junit Test Case,重载它的setup方法,生成一个OSGI环境:

host = new FelixHostApplication();

 

然后通过反射的方法(见文《在osgi容器外应用osgi bundle提供的服务》),就可以获得注册的服务了。

pax-exam+maven应用于osgi的集成测试 1  Pax-exam 说到测试框架,spring DM自带了一个集成junit的测试框架spring-dmtest,在实际使用中,因为需要tester也要定义一大串的依赖关系,并且对组件的启动顺序有要求,提高了环境调试的工作量,转而调研了pax-exam这个框架。   Pax-exam是用来测试osgi框架和应用程序的工具。它负责的自动化case执行顺序大致如下: 1.      启动一 阅读详情

相关推荐

14、OSGi 应用开发:深入服务与测试配置

本文深入探讨了OSGi应用开发中的服务、测试与配置管理。文章首先分析了OSGi服务的高级特性,如服务属性配置与实例化问题。随后,详细介绍了如何通过单元测试和集成测试确保OSGi应用的健壮性,并提供了基于JUnit和Spring DM的实际测试示例。最后,文章讨论了如何利用OSGi的配置服务(包括Configuration Admin、Log服务和Metatype服务)实现灵活、可维护的配置框架。通过这些方法,开发者可以构建更加稳定、可扩展的OSGi应用。

elastic6hunter的博客 76

eclipse + Felix 开发环境搭建 bundle 开发与调试

详细介绍了eclipse +Felix环境搭建,bundle 开发与调试,bundle自动更新。

nana_jiqiang的专栏 3744

OSGI常见错误分析与高效解决方案详解

OSGI(Open Service Gateway Initiative)作为一种动态模块化框架,广泛应用于Java平台的插件化系统开发中。其核心优势在于通过精细的模块划分和服务解耦,实现系统的高可维护性与动态扩展能力。本章将深入剖析OSGI的基本架构组成,包括Bundle、Service Registry、Module Layer与Lifecycle Layer四大核心组件。graph TDA[Bundle] -->|导出包| B[Module Layer]

weixin_36238982的博客 1003

(01) Apache Felix 入门 - 01

 1、前言 这篇文章是自己参照  Apache Felix 官网 参考指导手册上的学习步骤书写的篇目,算不上原创的内容,权当时自己写的一些学习笔记,当然其中内容也不是完全参照官网上说的来写,一些部分按照自己的理解做了些修改,更加便于自己理解,对于文中一些地方读者觉得不明白或者笔者理解错误的地方,欢迎各位读者指正,互相学习! 2、适合读者  本文适合对于Java 一些高级特性比较了解,对于项目...

Dreamcatcher_yxc的博客 6627

j4o-generator:JUnit4OSGi eclipse插件生成器。-开源

JUnit4OSGi插件将生成一个新项目,其中包含与junit4osgi-framework条件有关的具有所选方法,套件和清单的所选测试用例。 以后可以直接在Eclipse IDE中使用SwingGUI Runner测试该项目。 该项目是文凭论文的一部分。

基于 OSGI 的 RCP 测试 1 Equinox

基于 OSGI 的 RCP 测试 1 Equinox

自动化的OSGi测试运行器

在我的团队成员中,我以忘记维护(JUnit)测试套件而闻名。 我只是无法为此付出额外的手动为套件添加测试的步骤。 幸运的是,有连续的集成服务器通过命名模式收集测试。 如果我介绍的一项孤立测试失败了,那么它会脱颖而出。 为了弥补这一点,我创建了一个(几乎)免维护的测试运行器。 虽然普通的JUnit测试已经有了这种东西 ,但我找不到OSGi测试的类似东西。 当具有多个捆绑软件时,您通常会...

最佳 Java 编程 298

OpenWrt虚拟机磁盘扩容实战:从SquashFS到ext4的完整避坑指南

本文详细介绍了OpenWrt虚拟机磁盘扩容的完整流程,重点对比了SquashFS和ext4文件系统在扩容操作上的关键差异。通过五步安全迁移法和直接分区调整方案,帮助用户有效解决磁盘空间不足问题,同时提供高级技巧和故障排除指南,确保扩容过程顺利无坑。

weixin_29251131的博客 229

Vespa container 依赖:JDisc OSGi Bundle 开发的便捷依赖详解

本文围绕 Vespa 仓库中的 [container 模块](https://link.gitcode.com/i/c4deec2d9fe2142277d82346d903aee2) 展开,它本质上是一个**面向 JDisc(Vespa 容器运行时)OSGi Bundle 开发者的便捷依赖聚合(convenience dependency)**。文章会讲解如何把 `com.yahoo.vespa:

gitblog_00906的博客 450

Vast.ai GPU服务器租用与SSH密钥连接实战指南

本文详细介绍了如何在Vast.ai平台租用GPU服务器并通过SSH密钥安全连接的全流程。从注册、选配GPU型号到SSH密钥生成与配置,再到实战中的端口转发和文件传输技巧,帮助用户高效利用云端GPU资源进行深度学习等计算密集型任务。

weixin_29574585的博客 526

dpdk 源码分析 rte_ring

rte_ring源码分析

qq_40843445的博客 929

DBeaver 如何注册 OSGi 测试运行器并编写集成测试

DBeaver 的模型层代码大量依赖 OSGi 容器与 `DBWorkbench` 平台,纯 JUnit 用例无法覆盖需要运行环境的场景。仓库为此内置了自定义 OSGi 测试运行器(bundle `org.jkiss.dbeaver.osgi.test.runner`,配合 JUnit 5 使用)。本文的任务:为某个生产 bundle 新建测试插件、把它注册进 Maven 构建,并编写一个能在 O

gitblog_00613的博客 231

多思计组实验实验六 微程序控制器实验

实验六 微程序控制器实验

qq_53089329的博客 3781

OSGI 学习笔记

OSGI最初是从嵌入式设备中发展起来的。后来由于Eclipse的成功,居于Equionx的RCP开发在桌面领域大方异彩。现在,互联网和基于浏览器的企业应用已成为整个IT业界最重要的组成部分,OSGI开始为服务器端应用和企业应用领域提供支持。OSGI 框架是一个微核结构的容器,所有的模块都需要运行在容器范围内,在 OSGI中所有模块的部署都必须以 Bundle的方式来进行部署。 目录 1. 前景...

布道 3501

【Frida Android】实战篇8:客户端证书认证绕过 Hook 教程

通过重写类的方法,自定义证书校验逻辑;利用配置文件,从系统层面管理证书信任策略;以及通过 OkHttp 框架提供的方法,实现证书的强绑定校验。这些内容主要围绕客户端如何验证服务端证书的合法性展开。客户端证书认证。当 APK 预置了客户端证书,并且服务端会对客户端证书进行校验时,传统的中间人攻击方式将面临新的挑战。我们将深入分析这种场景的工作原理,并详细介绍如何通过技术手段获取客户端证书、配置中间人工具,最终成功实现抓包分析。

水滴石穿 1426

解读 2025《高质量数据集 质量评测规范》

《高质量数据集质量评测规范》为2025年数据质量评估提供标准化框架,适用于政府部门、AI企业、数据服务商等行业主体。规范以"说明文档-数据质量-模型应用"三维体系为核心:明确定义高质量数据集分类,细化各项指标要求(包括文档完整性、数据规范性、应用多样性等),并提供具体评分细则(百分制,90分达标)和计算方法。附录补充多模态数据处理细则,旨在建立可操作的质量评估标准,保障优质数据供给流通。

cdfunlove的博客 1882

使用arquillian作为osgi集成测试工具

arquillian是JBoss公司的集成测试工具,支持ejb,cloud,android等目标容器的测试,本文以http://books.sonatype.com/mcookbook/reference/osgi-sect-starting-osgi-container.html为基础,演示了在osgi环境下,如何进行集成测试。 ../poms/compiled/

u011154682的专栏 971

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2203

Pentaho Kettle file-stream 流式步骤插件:构建、单元测试与集成测试实战指南

本篇以 `plugins/file-stream` 模块自带的构建文档为骨架,完整讲解该 OSGi 插件模块从环境准备、release/dev 两种构建模式,到单元测试、集成测试与远程调试的完整操作流程;并结合模块的 [pom.xml](https://link.gitcode.com/i/a4acf34a977819dd0359a53ec9b827be)、[FileStream.java](ht

gitblog_00346的博客 208

Python爬虫实战:高效爬取中国专利数据库的完整指南

在当今信息爆炸的时代,专利数据作为技术创新的重要指标,对企业研发、市场分析和学术研究都具有极高价值。中国作为全球专利申请量最大的国家,其专利数据库包含了海量的技术创新信息。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的中国专利数据库爬虫系统。中国专利数据库主要由国家知识产权局(CNIPA)维护,包含发明专利、实用新型专利和外观设计专利三大类。截至2023年,中国专利数据库已收录超过400万件发明专利和300万件实用新型专利。

2201_76125261的博客 1572

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

OSGi在集成测试中的应用

最近对测试(集成测试+单元测试)代码进行了一下重构, 导致很多以前运行通过的测试现在都无法通过了, 由于我们的test case在测试前需要加载一堆spring配置文件, 而这个加载过程耗尽了99%的测试时间, 无尽的等待实在让人心烦. 虽然使用TestSuite可以对这些spring配置文件只需要加载一次, 但是如果需要对一个个的testcase进行单个调试修改的话, 就比较耗时了. 当然我们...

疯狂的菠菜 240

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OpenCV Maven 构建指南:用 Maven 一键产出 OSGi 兼容的 Java 原生捆绑包

OpenCV 在 Java 侧的常规构建方式是基于 CMake 生成并编译 `opencv_java` 模块,再交由传统 Java 工程引用;而本仓库在 [platforms/maven](https://link.gitcode.com/i/6d7abe6452ec9a791d165a92c06e7b54) 目录中提供了一套完整的 Apache Maven 构建方案,将既有 CMake 流程包装

gitblog_00612的博客 496

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

OSGi使用小结

最近使用OSGi来解决一个集成测试的问题. 感觉还是走了不少弯路, 主要是OSGi的一些习惯思维跟以前的开发思想有一定的区别(主要集中在ClassLoader), 另外一点就是当出现一些莫名其妙的问题, 一般很难知道原因, 需要从出错信息的蛛丝马迹中根据经验进行推理(汗,程序员看推理小说对解决问题很有帮助啊). 本人使用的eclipse版本是3.5.x, 只用到了equinox框架, 使用了...

疯狂的菠菜 276

Java-Thread-Affinity与OSGi集成:在模块化应用中的线程亲和性管理指南

Java-Thread-Affinity是一款轻量级Java库,可实现线程与CPU核心的绑定管理,而OSGi作为动态模块化系统,两者结合能为复杂应用提供更精细的资源控制。本文将详解如何在OSGi环境中集成Java-Thread-Affinity,实现模块化应用的线程亲和性管理。 ## 🌟 线程亲和性与模块化的协同优势 线程亲和性技术允许开发者将关键线程绑定到特定CPU核心,减少线程切换开销并

gitblog_00083的博客 342

使用pax.exam对osgi(基于maven)进行集成测试

xml配置文件 就下列依赖加入xml的配置文件 &lt;!-- test start --&gt;  &lt;dependency&gt;   &lt;groupId&gt;junit&lt;/groupId&gt;   &lt;artifactId&gt;junit&lt;/artifactId&gt;   &lt;version&gt;4.10&lt;/version&g

longload 321

开发OSGi中遇到的一些问题记录

问题一:          在《深入理解OSGi---Equinox原理、应用与最佳实践》第325页至329页按照书上指示安装了Spring DM,并且运行了简单的例子,发现运行报错:Caused by: java.lang.IllegalStateException: The System Bundle was updated. The framework must be restarted t

风雨诗轩的博客 1136
上一篇: swt和awt之间的互调
下一篇: osgi服务模型
tkxing
博客等级 码龄19年 1粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值