JUnit 5 的 spring-boot-starter-test

新手上路,请多包涵

使用 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
}

原文由 user605331 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 697
2 个回答

从 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 包中。

原文由 Mike 发布,翻译遵循 CC BY-SA 4.0 许可协议

对其他贡献者提到的内容的一些补充说明:

使用 Spring Boot > 2.4.0

如果您使用的是 Spring Boot > 2.4.0 ,那么您无需执行任何操作即可使用 JUnit 5 Jupiter,因为 spring-boot-starter-test 库不再包含 vintage-engine 依赖项(可传递包括 JUnit 4),只需将入门依赖项包含到项目中,您就可以开始了。在 Gradle 配置中使用 useJUnitPlatform()

使用 2.4.0 > Spring Boot > 2.2.0

如果您使用早期版本,我建议使用高于 2.2.0.RELEASE 的版本,这是 Spring 团队默认将对 JUnit 5 Jupiter 的支持添加到 spring-boot-starter-test 中的版本。

在这些版本中,该库也包含 Vintage Engine 依赖项,可用于使用 JUnit 5 Jupiter 平台运行 JUnit 4 测试。如果您不需要执行 JUnit 4 测试,那么 spring 团队建议排除 org.junit.vintage:junit-vintage-engine (不仅仅是 junit 如描述中所示):

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

当然,在这里您还需要配置 useJUnitPlatform() 指令。

原文由 Gerardo Roza 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题