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

时间:2012-08-22 12:14:34

标签: java eclipse junit osgi

我的一个项目中有一些奇怪的问题。我试图在OSGi环境中运行一些JUnit测试(测试是在一个由osgi包托管的片段中;操作是使用eclipse中的“JUnit Plug-in Test”启动器启动的)。当我尝试启动测试时,出现以下错误:

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))所需的正确范围内。

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

提前感谢任何可以帮助我解决问题的想法,

1 个答案:

答案 0 :(得分:2)

您的JUnit插件测试配置中似乎缺少一些捆绑包。您可以使用Validate Plug-ins页面上的Plugins功能检查配置是否完整。注意:我有一些依赖蠕变的情况,通常来自一些“无辜的”eclipse运行时插件,它本来就不应该存在。

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

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

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

然后,在你的单元测试准备中,你可以简单地声明一个Mock并使用bind方法注入它。

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

对于捆绑间集成&amp;系统测试然后您可以选择Junit plugin test或查看Pax Exam