当在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版本的相关描述。