一連の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のバージョンが間違っています)。
私の経験では、プラグインテストを含むプラグインがjunitに依存していない場合にこれが発生します。 junit 4.4の依存関係をMANIFEST.MFファイルに追加した後、エラーはなくなり、すべてのテストが実行されました。プラグインは通常、テストコードにのみ必要であるため、junitの依存関係はオプションである必要があります。
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
だけを使用しているので、それを使い続けます。
Org.junitからではなくcom.springsource.org.junitから@Testタグをインポートする必要があるのではないかと思います。
ヴォルカー
確かにpluginテストではありませんが、jMock、JUnit、Eclipseで同様のサウンドの問題が発生しました 最近 。
関連性があるかどうかはわかりませんが、次のバージョンですべて機能しました:-
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() {
ActivatorTestはTestCaseを拡張する必要があります
春のテストフレームワークはjunit4.4 +と互換性がないと思います
@RunWith(Suite.class)@SuiteClasses({UserServiceTest.class、ABCServiceTest.class})
パブリッククラスAllTestSuite {
public static Test suite(){
return new JUnit4TestAdapter(AllTestSuite .class);
}
}
JUnitのバージョンはわかりませんが、テストを正常に見つけるには、テストメソッド名を単語 "test"で始める必要があります。
新しいバージョンでは、@ Testでテストをマークするだけです。私にとっては、次の組み合わせで機能します。
import static junit.framework.Assert.*;
...
@Test
public void testDummy() throws Exception
JUnitバンドルにMANIFEST.MFのエントリがない可能性があります。
動的-インポート-パッケージ:*
これは、他のバンドルからクラスをロードするために必須です。
ベボ