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 这工作正常。


编辑:

我对此进行了深入研究,并想添加这个有趣的部分:我实际上可以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