Spring-Boot-Starter-Test с JUnit 5

Использование spring-boot-starter-test в версии 2.0.6 приводит к зависимости JUnit 4. Как я могу использовать spring-boot-starter-test (через Gradle), но вместо этого использовать JUnit 5 без втягивания зависимости JUnit 4?

Вот часть вывода зависимости от Gradle, если это помогает:

+--- org.springframework.boot:spring-boot-starter-test -> 2.0.5.RELEASE
|    +--- org.springframework.boot:spring-boot-starter:2.0.5.RELEASE (*)
|    +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE
|    |    \--- org.springframework.boot:spring-boot:2.0.5.RELEASE (*)
|    +--- org.springframework.boot:spring-boot-test-autoconfigure:2.0.5.RELEASE
|    |    +--- org.springframework.boot:spring-boot-test:2.0.5.RELEASE (*)
|    |    \--- org.springframework.boot:spring-boot-autoconfigure:2.0.5.RELEASE (*)
|    +--- com.jayway.jsonpath:json-path:2.4.0
|    |    +--- net.minidev:json-smart:2.3
|    |    |    \--- net.minidev:accessors-smart:1.2
|    |    |         \--- org.ow2.asm:asm:5.0.4
|    |    \--- org.slf4j:slf4j-api:1.7.25
|    +--- junit:junit:4.12
|    |    \--- org.hamcrest:hamcrest-core:1.3


Вот мой файл build.gradle:

buildscript {
    ext {
        springBootVersion = '2.0.6.RELEASE'
    rootGradleDir = "${rootProject.rootDir}/gradle"
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
    }
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

apply from: "${rootGradleDir}/staticCodeAnalysis.gradle"

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

test {
  useJUnitPlatform()
}

dependencies {
    implementation('org.springframework.boot:spring-boot-starter-data-jpa')
    implementation('org.springframework.boot:spring-boot-starter-jdbc')
    implementation('org.springframework.boot:spring-boot-starter-security')
    implementation('org.springframework.boot:spring-boot-starter-thymeleaf')
    implementation('org.springframework.boot:spring-boot-starter-validation')
    implementation('org.springframework.boot:spring-boot-starter-web')
    implementation('org.liquibase:liquibase-core')
    runtimeOnly('org.springframework.boot:spring-boot-devtools')
  runtimeOnly('org.postgresql:postgresql')
  testImplementation('org.springframework.boot:spring-boot-starter-test')
  testImplementation('org.springframework.security:spring-security-test')

  implementation('org.glassfish.jaxb:jaxb-runtime:2.3.1')
  implementation('org.glassfish.jaxb:jaxb-runtime2.3.1')
  implementation('org.springframework.boot:spring-boot-starter-data-redis')

  testCompile('org.junit.jupiter:junit-jupiter-api:5.3.1')
  testCompile('org.junit.jupiter:junit-jupiter-params:5.3.1')
  testRuntime('org.junit.jupiter:junit-jupiter-engine:5.3.1')
}

ОБНОВИТЬ

Добавление зависимости JUnit 5 и выполнение исключения, упомянутого в комментариях, помогли. Теперь тестовая зависимость выглядит так:

testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'junit', module: 'junit' //by both name and group
}

Отметьте это dzone.com/articles/…. Вам просто нужно исключить junit 4

lealceldeiro 17.10.2018 21:39

@lealceldeiro просто попробовал, и это сработало. Спасибо!

user605331 18.10.2018 01:06
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
28
2
29 735
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Начиная с Gradle 4.6 (я полагаю), есть встроенная поддержка JUnit 5. Вы можете просто включить JUnit5 следующим образом:

dependencies {
  testCompile "org.junit.jupiter:junit-jupiter-api:5.2.0"
  testCompile "org.junit.jupiter:junit-jupiter-params:5.2.0"
  testRuntime "org.junit.jupiter:junit-jupiter-engine:5.2.0"
}

Также вам понадобятся:

test {
  useJUnitPlatform()
}

JUnit 4 и 5 используют разные имена пакетов, поэтому они могут сосуществовать в одном проекте. Многие аннотации одинаковы (@Test и т. д.), Поэтому убедитесь, что вы включили их из пакета org.junit.jupiter.api.

Спасибо. Я тоже это сделал, но зависимость JUnit 4 все еще присутствует. Похоже, что маршрут исключения, упомянутый @lealceldeiro, является подходящим вариантом.

user605331 17.10.2018 22:02

Правильно, вам нужно будет исключить его, если вы не хотите, чтобы он был включен вообще.

Mike 17.10.2018 22:30

Здесь используется реализация вместо компилировать.

test {
  useJUnitPlatform()
}

dependencies {
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.4.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
}

Обновление 2020-10-29

В нашем проекте Spring Boot 2.3 нам больше не нужен этот фрагмент. По умолчанию он уже использовал JUnit 5.

Десять месяцев спустя, используя Gradle 5.4.1, Spring Boot 2.1.7.RELEASE и JUnit 5.5.1, я обнаружил, что использую другую зависимость, чем другие ответы. Кроме того, я обнаружил, что лучше включать совокупный артефакт, а не отдельные артефакты:

testImplementation('org.junit.jupiter:junit-jupiter:5.5.1')

Вы можете узнать больше о моих наблюдениях из этого другого моего SO Q&A: Взаимодействие между Spring Boot и JUnit 5 - должны использоваться общие артефакты, а не отдельные лица?

Похоже, что более новые версии spring-boot-starter-test (замеченные в 2.2.6 / 2.2.7) импортируют org.junit.vintage:junit-vintage-engine, который имеет транзитивную зависимость от junit:junit. Исключение только junit дало мне несколько ложных ошибок:

May 13, 2020 9:20:05 AM org.junit.platform.launcher.core.DefaultLauncher handleThrowable
WARNING: TestEngine with ID 'junit-vintage' failed to discover tests
java.lang.NoClassDefFoundError: junit/runner/Version
...
Caused by: java.lang.ClassNotFoundException: junit.runner.Version
...

Параметр:

testCompile('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage'
}

помогло мне, и все тесты продолжают работать нормально

Просто добавь

testImplementation('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'junit', module: 'junit'
}
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2'

А также:

test {
    useJUnitPlatform()
}

Несколько дополнительных примечаний к тем, которые упоминали другие участники:

Использование Spring Boot> 2.4.0

Если вы используете Spring Boot> 2.4.0, то вам ничего не нужно делать, чтобы использовать JUnit 5 Jupiter, потому что библиотека spring-boot-starter-test больше не включает зависимость от винтажного движка (которая транзитивно включала JUnit 4), просто включите начальную зависимость для проект, и все готово. Используйте useJUnitPlatform() в конфигурации Gradle.

Использование 2.4.0> Spring Boot> 2.2.0

Если вы используете более ранние версии, я бы предложил использовать версию выше, чем 2.2.0.RELEASE, где команда Spring по умолчанию добавила поддержку JUnit 5 Jupiter в spring-boot-starter-test.

В этих версиях библиотека также включала зависимость Vintage Engine, которую можно было использовать для запуска тестов JUnit 4 с использованием платформы JUnit 5 Jupiter. Если вам не нужно выполнять тесты JUnit 4, то команда Spring предлагает исключить org.junit.vintage:junit-vintage-engine (а не только junit, как указано в описании):

testCompile('org.springframework.boot:spring-boot-starter-test') {
    exclude group: 'org.junit.vintage'
}

Конечно, здесь вам также потребуется настроить директиву useJUnitPlatform().

Другие вопросы по теме