23

一連の Eclipse プラグイン テストで JUnit 4.4 (またはそれ以降) を使用する必要がありますが、次の問題が発生しました。

springsourceの junit 4.4 または 4.5 バンドル ( junit44およびjunit45 ) で実行すると、テストが検出されません。Eclipse で取得できる org.junit4 バンドルは、junit 4.3 (Ganymead / Eclipse 3.4 の時点) を提供します。org.junit4 バンドル、テストを識別して実行するという点で機能しますが、JMock の最新バージョンと互換性がなく、モック ライブラリを使用する必要があります。

サンプルテストは次のとおりです。

package testingplugin;

import static org.junit.Assert.*;
import org.junit.Test;

public class ActivatorTest {
   @Test
   public final void testDoaddTest() {
      fail("Not yet implemented");
   }
}

このテストを実行すると、次の例外が発生します。

java.lang.Exception: No runnable methods
    at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:33)
    at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
    at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
    at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
    at org.eclipse.pde.internal.junit.runtime.RemotePluginTestRunner.main(RemotePluginTestRunner.java:62)
    at org.eclipse.pde.internal.junit.runtime.CoreTestApplication.run(CoreTestApplication.java:23)
    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.internal.app.EclipseAppContainer.callMethodWithException(EclipseAppContainer.java:574)
    at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:195)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110)
    at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79)
    at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:382)
    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:549)
    at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
    at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
    at org.eclipse.equinox.launcher.Main.main(Main.java:1212)

ただし、プロジェクトの依存関係を com.springsource.org.junit から org.junit4 に切り替えると、テストが実行されて失敗します (予想どおり)。

次のプログラム引数を使用して、Eclipse で JUnit プラグイン テストとしてテストを実行しています。

-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}

起動時に選択された次のプラグイン (私が選択し、「必要なプラグインを追加」を使用して残りの依存関係を取得しました。):

Workspace:
   testingPlugin
Target Platform:
   com.springsource.org.hamcrest.core (1.1.0)
   com.springsource.org.junit (4.5.0)
   ....and a bunch of others... (nothing related to testing was auto-selected)

ここに私の MANIFEST.MF があります:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: TestingPlugin Plug-in
Bundle-SymbolicName: testingPlugin
Bundle-Version: 1.0.0
Bundle-Activator: testingplugin.Activator
Import-Package: org.osgi.framework;version="1.3.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: com.springsource.org.junit;bundle-version="4.5.0"

最後の行を次のように切り替えます。

Require-Bundle: org.junit4;bundle-version="4.3.1"

起動時に選択したプラグインを次のように更新します。

Workspace:
   testingPlugin
Target Platform:
   org.junit4 (4.3.1)
   ...bunches of auto-selected bundles... (again, nothing else test related)

テストが正しく実行されるようにします (ただし、junit のバージョンが間違っています)。

4

9 に答える 9

4

私の経験では、これは、プラグイン テストを含むプラグインが junit に依存していない場合に発生します。junit 4.4 の依存関係を MANIFEST.MF ファイルに追加した後、エラーはなくなり、すべてのテストが実行されました。junit の依存関係は、プラグインが通常テスト コードにのみ必要とするため、オプションにする必要があります。

于 2009-06-02T12:42:47.347 に答える
2

Eclipse 3.4のインストールが手元にないため、今これをテストすることはできませんが、(私が思うに) IntelliJ IDEA 7.0.xでしばらく前に同様の問題に遭遇しました.回避策は明示的にテストを指定することでした.ランナー。

JUnit 4.5 の場合:

import org.junit.runners.JUnit4;

@RunWith(JUnit4.class)
public class ActivatorTest {
    //...
}

これがうまくいかない場合は、より多くの成功を収めることができますorg.junit.runners.BlockJUnit4ClassRunner

JUnit 4.4の場合、試してみますorg.junit.internal.runners.JUnit4ClassRunner

編集:com.springsource.Springsourceを使用していないため、その部分についてはよくわかりません。あなたの質問から、springsource は JUnit を再パッケージ化しているように見えますが、コード内でのみ使用しているため、com.springsource.org.junitそのまま使用します。org.junit

于 2008-12-11T08:44:52.077 に答える
1

org.junit からではなく、com.springsource.org.junit から @Test タグをインポートする必要があるかどうか疑問に思っています。

フォルカー

于 2009-01-30T08:03:46.750 に答える
0

ActivatorTest は TestCase を拡張する必要があります

于 2008-11-25T08:25:50.000 に答える
0

JUnit バンドルに MANIFEST.MF のエントリがない可能性があります。

動的インポート パッケージ: *

これは、他のバンドルからクラスをロードするために必須です。

ベボ

于 2008-11-25T08:05:35.360 に答える
0

JUnit のどのバージョンであったかはわかりませんが、test を見つけるには、テスト メソッド名が「test」という単語で始まる必要があります。

新しいバージョンでは、 @Test でテストをマークするだけで済みます。私にとっては、この組み合わせで機能します。

import static junit.framework.Assert.*;
...
@Test
    public void testDummy() throws Exception
于 2008-11-04T08:26:46.113 に答える