1

プロジェクトの 1 つに奇妙な問題があります。OSGi 環境で JUnit テストを実行しようとしています (テストは osgi bundle によってホストされているフラグメントにあります。操作は 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アーカイブからのもの)を持っています。構成を確認しましたが、違いは見つかりませんでした。したがって、現在、この問題の原因を理解できません。

それを解決するのに役立つアイデアを前もって感謝します。

4

1 に答える 1

2

JUnitプラグインテスト構成にいくつかのバンドルが欠落しているようです。Validate Plug-insページの機能を使用してPlugins、構成が完了したかどうかを確認できます。注意:私はこのメソッドで依存関係がクリープするケースがいくつかありました。通常は、そもそもそこにあるべきではなかった「無実の」Eclipseランタイムプラグインからのものです。

そうは言っても、DS(Declarative Services)を使用する場合は、OSGi APIへの依存関係をすべて排除できるため、vainillaJUnitを使用してコードをテストできます。DSの特に隠された宝の1つは、サービスpublic void activate(ComponentContext context)にを挿入できるこのサービスアクティブ化署名ですComponentContext。モック(Mockitoを使用)を使用すると、リソースのロードなど、必要な呼び出しをモックできます。

同様に、記述子で宣言されているライフサイクルメソッド(bind、unbind)を介して注入できるため、すべてのサービスをモックできます( osgi-infEquinoxを使用します)。

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

次に、単体テストの準備で、モックを宣言し、bindメソッドを使用してそれを注入できます。

これにより、OSGi内でのテスト作業がはるかに簡単になります。これは、各テストのバンドル構成を作成して維持する必要がないと同時に、vainillaJunitテストの実行がはるかに高速になるためです。

バンドル間の統合とシステムテストについては、PaxExamを選択するJunit plugin test調べることができます。

于 2012-08-23T15:09:39.397 に答える