当在Gradle项目中引入JUnit5与spring-boot-starter-test时,解决它们之间的冲突问题

目标

使用Spring Boot的starter来引入JUnit5,以及准备对现有的JUnit4测试进行适配。对于熟悉的人来说,这并不是一个难题,但我花了半天时间来完成。

2019年11月20日的备注

截至2019年11月20日,现在修复了由Spring Initializr生成的build.gradle文件,并且默认情况下只启用了jUnit5。
虽然我没有确认实际的源代码,但是被排除的”org.junit.vintage”是指jUnit4之前的组件。因此,我认为如果删除此行,则jUnit4也可以正常运行。

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

依赖性的解决

排除在starter-test中包含的JUnit组。

这是很重要的。
由于starter-test已经包含了Junit4,所以我们需要将其排除一次。
参考来源:Stack Overflow:spring-boot-starter-test与JUnit 5


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

应用依赖管理插件导入BOM

如果直接指定版本的话就不需要,但是在这里我们将使用Spring提供的Dependency Management Plugin。由于JUnit5本身和gradle和IDE的兼容模块版本完全不同,所以我认为使用BOM更安全。

请检查 build.gradle 文件的开头部分,因为根据创建项目时的环境,插件可能已经被应用。

参考:插件官方页面的相关部分


apply plugin: 'io.spring.dependency-management'//プラグインを適用

dependencyManagement {
    imports {
        mavenBom "org.junit:junit-bom:5.4.2"//BOMのインポート
    }
}

重新添加Junit的依赖(2019/06/12补充说明,仅仅进行本章设置是不够的)

在dependencies块中重新添加所需的模块。
将其添加到之前从starter-test中删除JUnit的设置之后。
参考:@tsukakei提供的JUnit5用户指南日本语翻译。

dependencies {
...
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    }
    testCompile 'org.junit.jupiter:junit-jupiter'//JUnit5のAPI
    testRuntime 'org.junit.platform:junit-platform-launcher'//IDEなどのサポート用
    testRuntime 'org.junit.vintage:junit-vintage-engine'//JUnit3,4対応
...
}

由于使用BOM,不需要版本指定。安装设置已完成。

2019/06/12:补充说明-1 将依存关系的声明更正为Gradle5的格式,并添加设置以使用Gradle和IDE进行Junit测试。

在确认只有前述的设置无法正常运行之后,我们进行了额外的调查。
首先,修改了依赖声明,因为其不符合Gradle5的格式。
参考:junit5-migration-gradle示例中的build.gradle文件
参考2:Gradle官方的Using JUnit 5

dependencies {
...
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'junit', module: 'junit'
    }
    testImplementation 'org.junit.jupiter:junit-jupiter'//JUnit5のAPI
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'//IDEなどのサポート用
    testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'//JUnit3,4対応
    testCompileOnly 'junit:junit'//Junit5のBOMからJunit4を入れなおせば、4以前のテストも競合しないようです
...
}

/* Gradle,IDEからJunitテストを起動するための設定*/
test {
    useJUnitPlatform()//このブロックで細かい設定が可能
}

我之前说过JUnit4的测试无法运行,但是通过重新添加JUnit4作为依赖,它似乎能够正常运行。
此外,要从Gradle启动JUnit的测试,需要在test任务中声明使用JUnitPlatform。

2019/06/12: 追加内容-2 避免在JUnit中进行Spring测试时的特殊问题

当进行到上述设置并从Gradle中进行统一测试时,发现测试启动失败的情况。
这是Spring特有的问题,看起来有一些解决方法。
除此之外,由于Spring(SpringMVC)特有的设置等原因,很多情况下测试无法如预期般运行,因此我计划在近日内将“使用JUnit5测试SpringMVC”总结到另一篇文章中。
如果设置正确,应该可以正常运行而无任何问题。

刷新项目

使用IDE或命令行刷新依赖缓存。
这样,JUnit5现在可以在Spring Boot的启动器中使用了。

请参考前面提到的用户指南,了解有关JUnit4测试迁移至5版本的相关描述。

因为某些注释已被废除,所以必须修改源代码才能正常运行 → 重新添加JUnit4似乎可以使其正常运行 ↩
广告
将在 10 秒后关闭
bannerAds