java - 使用OSGi启动JUnit测试时出现IllegalStateException

原文 标签 java eclipse junit osgi

我的一个项目中有一个奇怪的问题。我试图在OSGi环境中运行一些JUnit测试(测试在osgi软件包托管的片段中;操作是通过Eclipse的“ JUnit插件测试”启动器启动的)。当我尝试启动测试时,出现以下错误:

java.lang.IllegalStateException: Unable to acquire application service. Ensure that the    org.eclipse.core.runtime bundle is resolved and started (see config.ini).
    at  org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:74)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:619)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:574)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1407)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1383)
An error has occurred. See the log file


在上面的日志中,我还得到:

!ENTRY org.eclipse.osgi 2 0 2012-08-22 13:53:24.058
!MESSAGE One or more bundles are not resolved because the following root constraints are not resolved:
!SUBENTRY 1 org.eclipse.osgi 2 0 2012-08-22 13:53:24.059
!MESSAGE Bundle reference:file:/C:/.../plugins/org.eclipse.pde.junit.runtime_3.4.200.v20120530-1435.jar was not resolved.
!SUBENTRY 2 org.eclipse.pde.junit.runtime 2 0 2012-08-22 13:53:24.059
!MESSAGE Missing required bundle org.eclipse.core.runtime_[3.3.0,4.0.0).


但是,org.eclipse.core.runtime似乎可用(eclipse正在运行,没有任何问题,我可以使用OSGi运行来启动项目)。根据“ Eclipse安装详细信息”,核心运行时具有版本3.8.0.v20120521-2346,该版本处于junit([3.3.0,4.0.0))所需的正确范围内。

我还有另一个完全相同的蚀(相同版本等,它来自相同的.zip存档),在这里我可以为另一个项目运行相同类型的测试。我检查了配置,但找不到任何区别。因此,我目前无法理解导致此问题的原因。

在此先多谢您提出任何可以帮助我解决该问题的想法,

最佳答案

看来JUnit插件测试配置中缺少某些捆绑软件。您可以使用Validate Plug-ins页面上的Plugins功能来检查您的配置是否完成。当心:这种方法有一些依赖蠕变的情况,通常是从一些“无辜”的Eclipse运行时插件开始的,这些插件本来不应该存在的。

就是说,如果您使用DS(声明性服务),则可以消除对OSGi API的所有依赖关系,因此可以使用vainilla JUnit来测试您的代码。
DS的一个特别隐藏的宝藏是此服务激活签名public void activate(ComponentContext context),允许您将ComponentContext注入到服务中。使用模拟(我们使用Mockito),您可以模拟任何所需的调用,例如加载资源。

同样,您可以模拟所有服务,因为它们可以通过osgi-inf描述符中声明的生命周期方法(绑定,解除绑定)注入(我们使用Equinox):

<reference interface="com.service.itf" name="UsefulService"  cardinality="1..1" policy="static" bind="onDependencyServiceUp"  unbind="onDependencyServiceDown"/> 


然后,在准备单元测试时,您只需声明一个Mock并使用bind方法将其注入即可。

这将使您在OSGi中进行测试的工作变得更加轻松,因为您不必为每个测试创建和维护捆绑配置,同时,vainilla Junit测试的运行速度也更快。

对于捆绑之间的集成和系统测试,您可以选择Junit plugin test或查看Pax Exam

相关文章:

java - 在以下期间发生内部错误:“ TestNG结果监听作业”。端口值超出范围:-1

java - Java-在程序结束时是否不“收集垃圾”对象?

java - 文件未成功上传到FTP

java - 错误Selenium无法检索已断开连接的文档状态:收到Inspector.detached事件

java - Eclipse:启动静态资源java.lang.IllegalArgumentException时出错

eclipse - Jenkins:如何在不删除第一个资源库URL的情况下将两个资源库URL检出到同一工作空间中?

java - 如何从Java数组中获取非随机样本

java - 自定义调用TestSuite的多个TestExecutionListeners方法的最佳方法是什么?

java - OpenEJB和JUnit:Sessioncontext.isCallerInRole始终返回false

java - 如何从硒rc生成结果