web-dev-qa-db-fra.com

test de démarrage à ressort avec JUnit 5

En utilisant spring-boot-starter-test à partir de la version 2.0.6 introduit une dépendance JUnit 4. Comment puis-je utiliser spring-boot-starter-test (via Gradle), mais utilisez plutôt JUnit 5 sans que la dépendance de JUnit 4 soit extraite?

Voici une partie de la sortie de dépendance de Gradle si cela vous aide:

+--- 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


Voici mon build.gradle fichier:

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')
}

MISE À JOUR

L'ajout de la dépendance à JUnit 5 et la suppression de l'exclusion mentionnée dans les commentaires ont fait l'affaire. La dépendance de test ressemble maintenant à ceci:

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

À partir de la version 4.6 (je crois), il existe un support natif de JUnit 5. Vous pouvez simplement inclure JUnit5 comme suit:

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"
}

Vous aurez également besoin de:

test {
  useJUnitPlatform()
}

JUnit 4 et 5 utilisent des noms de paquetages différents, ils peuvent donc coexister dans le même projet. Bon nombre des annotations sont les mêmes (@Test, etc.) alors assurez-vous de les inclure à partir de la org.junit.jupiter.api paquet.

9
Mike

Voici en utilisant implémentation au lieu de compiler.

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'
}
3
Bienvenido David

Dix mois plus tard, et en utilisant Gradle 5.4.1, Spring Boot 2.1.7.RELEASE, et JUnit 5.5.1, J’ai trouvé que j’utilisais une dépendance différente de celle des autres réponses. De plus, j'ai trouvé qu'il était préférable d'inclure l'artefact global plutôt que les artefacts individuels:

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

Vous pouvez en savoir plus sur mon observation de cet autre SO Mes questions et réponses: Interaction entre Spring Boot et JUnit 5 - devez-vous utiliser les artefacts globaux et non les individus?

2
leeyuiwah