Junit5 с IntelliJ и Gradle

Попытка переноса моего проекта на java8 + Junit5 с помощью IntelliJ 2017.2

Я добавил junit-jupiter-api версию 5.0.0-M6

и junit-platform-launcher версия 1.0.0-M6

Структура проекта - это соглашение по умолчанию maven src/test/java

Нашел пару статей об этом, но ни один из них не разрешил мою проблему.

Он отлично работает в консоли, я полагаю, что это связано с IntelliJ по умолчанию JUnit Runner, или мне не хватает некоторых зависимостей?


Когда я запускаю один тестовый класс, все работает нормально, но когда я выбираю каталог и Run all 'Tests' in Java, как я это делал, я встречаю несколько ошибок.

WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.TestDescriptor.pruneTree()V

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;)Ljava/util/List;

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-jupiter' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.TestDescriptor.pruneTree()V

Aug 02, 2017 2:44:56 PM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;)Ljava/util/List;

Примечание. Я еще не перенес ни одного теста, все это синтаксис Junit 4.

Ответ 1

Добавление конкретных зависимостей решит проблему.

ПРИМЕЧАНИЕ: ОБНОВЛЕНИЕ INTELLIJ ВЫШЕ 2017.2.0, ТАК КАК БЫЛА БАГ С ПУНКТОМ JUNIT

КИСЛОРОД, если вы используете затмение.


Приведенная ниже зависимость включает параметризованные тесты Junit5, которые можно использовать вместо DataProvider.

"org.junit.jupiter:junit-jupiter-params:5.0.0"
//for JUnit5 parametrized tests.

Junit5 API.

"org.junit.jupiter:junit-jupiter-api:5.0.0"
//JUnit5 API

Необходим, если вы хотите запускать устаревшие тесты JUnit4 без изменения синтаксиса и импорта.

"org.junit.vintage:junit-vintage-engine:4:12.0"
//for legacy JUnit4 tests

РЕДАКТИРОВАТЬ: 07/2018 Сопоставить версию старинного раннера с версией Юпитера


Требуется, если вы хотите запускать тесты JUnit5 с новым синтаксисом и импортом.

"org.junit.jupiter:junit-jupiter-engine:5.0.0"
//for JUnit5 tests

java.lang.NoSuchMethodError: org.junit.platform.engine.EngineDiscoveryRequest.getDiscoveryFiltersByType(Ljava/lang/Class;) Ljava/util/List;


Пусковая установка

"org.junit.platform:junit-platform-launcher:1.0.0
//to handle default launcher

Исключение в потоке "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.ReflectionUtils.getDefaultClassLoader() Ljava/lang/ClassLoader;


Дополнительная информация как установить JUnit5


Начиная с версии 4.6 для Gradle, больше нет необходимости в подключаемых модулях. Gradle изначально поддерживает Junit5: версия старинного раннера теперь совпадает с версией JUnit 5.

dependencies {

    testImplementation "org.junit.jupiter:junit-jupiter-params:$junitVersion"
    testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"

    testRuntimeOnly "org.junit.vintage:junit-vintage-engine:$junitVersion"
    testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
}

test {  
    useJUnitPlatform {
        includeEngines 'junit-jupiter', 'junit-vintage'
    }
}

Ответ 2

Конфигурация, которую я использую, приведена ниже.

Винтажная зависимость от двигателя требуется только в том случае, если вы используете тесты junit4.

Параметры юпитера требуются только при использовании параметризованных тестов.

<properties>
    <junit.version>5.0.0</junit.version>
</properties>
...
        <dependency>
            <groupId>org.junit.platform</groupId>
            <artifactId>junit-platform-launcher</artifactId>
            <version>1.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-engine</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.vintage</groupId>
            <artifactId>junit-vintage-engine</artifactId>
            <version>4.12.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

Ответ 3

для Android Studio, если вы столкнулись

Невозможно разрешить org.junit.jupiter: junit-jupiter-api

перейдите в ваш файл ..\AndroidStudioProjects\Pets\app\build.gradle

в разделе зависимостей

введите эти две строки кода

 testImplementation 'junit:junit:4.12'
 androidTestImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.0-M4'

Ответ 4

Я должен изменить версию JUnit с 5.4.0 для 5.3.2, и она работает как шарм.