1

Eclipse を使用して、JUnit Jupiter で JUnit4 テスト ケース スイートに相当するものを作成する方法を見つけようとしています。

たとえば、JUnit 4 に次のテスト ケース スイートがあるとします。

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({
    CoreContentFactoryTest.class,
    DatatypesFactoryTest.class,
    SpecifiedValuesFactoryTest.class,
    EmbeddedValueFactoryTest.class,
    DefinitionFactoryTest.class
    })

public class TestCaseSuite {

}

すべてのテストが JUnit Jupiter に移植されていると仮定すると、JUnit Jupiter で同等のスイートを作成するにはどうすればよいですか?

datatypes上記のクラスを含むパッケージは次のとおりです。

import org.junit.platform.runner.  JUnitPlatform;
import org.junit.platform.suite.api.SelectPackages;
import org.junit.platform.suite.api.SuiteDisplayName;
import org.junit.runner.RunWith;

@RunWith(JUnitPlatform.class)
@SuiteDisplayName("Datatype Test Cases")
@SelectPackages({
    "datatypes"
})

public class TestCaseSuite {

}

ただし、JUnit4 テスト ケース スイートを実行するのと同じ方法で (「JUnit テストとして実行」と言って) これを実行しようとすると、次のエラー メッセージが表示されます。

java.lang.NoSuchMethodError: org.junit.runner.Description.createSuiteDescription(Ljava/lang/String;Ljava/io/Serializable;[Ljava/lang/annotation/Annotation;)Lorg/junit/runner/Description;
    at org.junit.platform.runner.JUnitPlatformTestTree.createJUnit4Description(JUnitPlatformTestTree.java:108)
    at org.junit.platform.runner.JUnitPlatformTestTree.buildDescription(JUnitPlatformTestTree.java:95)
    at org.junit.platform.runner.JUnitPlatformTestTree.lambda$buildDescriptionTree$0(JUnitPlatformTestTree.java:86)
    at java.lang.Iterable.forEach(Unknown Source)
    at java.util.Collections$SynchronizedCollection.forEach(Unknown Source)
    at java.util.Collections$UnmodifiableCollection.forEach(Unknown Source)
    at org.junit.platform.runner.JUnitPlatformTestTree.buildDescriptionTree(JUnitPlatformTestTree.java:86)
    at org.junit.platform.runner.JUnitPlatformTestTree.generateSuiteDescription(JUnitPlatformTestTree.java:72)
    at org.junit.platform.runner.JUnitPlatformTestTree.<init>(JUnitPlatformTestTree.java:50)
    at org.junit.platform.runner.JUnitPlatform.generateTestTree(JUnitPlatform.java:144)
    at org.junit.platform.runner.JUnitPlatform.<init>(JUnitPlatform.java:129)
    at org.junit.platform.runner.JUnitPlatform.<init>(JUnitPlatform.java:122)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:31)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:24)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:29)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:57)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:24)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:90)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:76)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:49)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:526)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:770)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:464)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:210)

ここで何が間違っていますか?JUnit 4を使用すると、これは正常に機能します。


編集:

私はこれを詳しく調べて、この興味深い部分を追加したいと思いました: I can really import org.junit.runner.Description、これは正常に動作し、メソッドを正常に呼び出すcreateSuiteDescriptionことができます。どうやら、何らかの理由でメソッドが間違った型のパラメーターで呼び出されているようです。関数のシグネチャは次のとおりです。

public static Description createSuiteDescription(String name, Annotation... annotations)

ただし、エラーメッセージによると、次のパラメーターで呼び出されます。

createSuiteDescription(Ljava/lang/String;Ljava/io/Serializable;[Ljava/lang/annotation/Annotation;)

これは明らかに外部クラスで呼び出されJUnitPlatformTestTree.java:108ます。これらは互換性のないバージョンである可能性がありますか? もしそうなら、互換性のあるバージョンは何ですか。

ただし、JUnitPlatformTestTree.java のエラー行を確認すると、関数が正しいパラメータで呼び出されているようです。

return Description.createSuiteDescription(name, identifier.getUniqueId());

次のgradleインポートを使用しています:

    testCompile('org.junit.jupiter:junit-jupiter:5.6.0')
    testCompile('org.junit.platform:junit-platform-runner:1.6.0')
    testCompile('org.junit.platform:junit-platform-suite-api:1.6.0')
    testCompile('org.junit.platform:junit-platform-launcher:1.6.0')
    testCompile('org.junit.platform:junit-platform-engine:1.6.0')
    testCompile('org.junit.platform:junit-platform-commons:1.6.0')
    testImplementation 'junit:junit:4.12'

編集2:

さて、これをさらに追跡したところ、gradle には、インポートするとすべてが台無しになるように見える次の依存関係があることがわかりました。

compile 'com.googlecode.json-simple:json-simple:1.1.1'

その依存関係をコメントアウトすると、テスト ケース スイートのエラーが消えます。ただし、プロジェクトには json.simple の JSONObject と JSONArray が必要なため、プロジェクトの大部分が機能しなくなります。

これは非互換性エラーのようです。何が原因で、どうすれば回避できますか?

4

0 に答える 0