我试图弄清楚如何使用 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,因此大部分项目停止工作。
这似乎是一个不兼容错误。是什么原因造成的,我该如何解决?