Я пытаюсь выяснить, как создать эквивалент набора тестов JUnit4 в JUnit Jupiter, используя Eclipse.
Например, допустим, у меня есть следующий набор тестов в 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'
EDIT 2:
Хорошо, я отследил это дальше и обнаружил, что в Gradle, у нас есть следующая зависимость, которая при импорте, кажется, разрушает все:
compile 'com.googlecode.json-simple:json-simple:1.1.1'
Если я закомментирую эту зависимость, ошибка в наборе тестовых примеров исчезнет. Однако, поскольку проекту требуются JSONObject и JSONArray из json .simple, большие части проекта перестают работать.
Это похоже на ошибку несовместимости. Что вызывает это, и как я могу обойти это?