web-dev-qa-db-ja.com

Junit4.4以降でEclipseJunitプラグインテストを実行する-テストが検出されないのはなぜですか?

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

Springsourceからのjunit4.4または4.5バンドル( junit44 および junit45 )で実行している場合、テストは検出されません。 Eclipseで入手できるorg.junit4バンドルはjunit4.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のバージョンが間違っています)。

23
rcreswick

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

4
Joen

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を試してみます

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

2
Thomas Dufour

Org.junitからではなくcom.springsource.org.junitから@Testタグをインポートする必要があるのではないかと思います。

ヴォルカー

1
ShiDoiSi

確かにpluginテストではありませんが、jMock、JUnit、Eclipseで同様のサウンドの問題が発生しました 最近

関連性があるかどうかはわかりませんが、次のバージョンですべて機能しました:-

  • jmock-2.5.1.jar
  • hamcrest-core-1.1.jar
  • hamcrest-library-1.1.jar
  • jmock-junit4-2.5.1.jar

JMockテストランナー このように使用する必要があることもわかりました:-

  import org.junit.Test;
  import org.junit.runner.RunWith;

  import org.jmock.Mockery;
  import org.jmock.Expectations;
  import org.jmock.integration.junit4.JUnit4Mockery;
  import org.jmock.integration.junit4.JMock;

  @RunWith(JMock.class)
  public class PublisherTest {

    Mockery context = new JUnit4Mockery();

    @Test 
    public void oneSubscriberReceivesAMessage() {
1
James Mead

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

0
shsmurfy

春のテストフレームワークはjunit4.4 +と互換性がないと思います

0
ssmithstone

@RunWith(Suite.class)@SuiteClasses({UserServiceTest.class、ABCServiceTest.class})

パブリッククラスAllTestSuite {

public static Test suite(){

     return new JUnit4TestAdapter(AllTestSuite .class);
 }

}

0
ranrose

JUnitのバージョンはわかりませんが、テストを正常に見つけるには、テストメソッド名を単語 "test"で始める必要があります。

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

import static junit.framework.Assert.*;
...
@Test
    public void testDummy() throws Exception
0
Drejc

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

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

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

ベボ

0
Bebbo