从2.0.6版开始使用spring-boot-starter-test
带来了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依赖项并执行注释中提到的exclude可以解决问题。现在,测试依赖项如下所示:
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit', module: 'junit' //by both name and group
}
答案 0 :(得分:7)
对其他贡献者提到的一些补充说明:
如果您使用的是 Spring Boot > 2.4.0
,那么您无需执行任何操作即可使用 JUnit 5 Jupiter,因为 spring-boot-starter-test
库不再包含 Vintage-engine 依赖项(它可传递地包含JUnit 4),只需将 starter 依赖项包含到项目中即可。在 Gradle 配置中使用 useJUnitPlatform()
。
如果您使用早期版本,我建议您使用高于 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()
指令。
答案 1 :(得分:5)
从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
包中包含它们。
答案 2 :(得分:4)
什么是gradle构建文件?
以下是GitHub上的一个示例,可能会有所帮助:
和分步教程:
答案 3 :(得分:4)
似乎正在导入spring-boot-starter-test
的较新版本org.junit.vintage:junit-vintage-engine
(在2.2.6 / 2.2.7中已注意到),它对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'
}
对我来说有用,所有测试都可以正常运行
答案 4 :(得分:2)
十个月后,使用Gradle 5.4.1
,Spring Boot 2.1.7.RELEASE
和JUnit 5.5.1
,我发现我使用的依赖关系与其他答案不同。另外,我发现最好包含聚合工件而不是单个工件:
testImplementation('org.junit.jupiter:junit-jupiter:5.5.1')
您可以从我的另一个Interaction between Spring Boot and JUnit 5 — must use the overall artifacts not the individuals?
SO问答中看到有关我的观察的更多信息答案 5 :(得分:0)
这里使用的是实现而不是 compile 。
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'
}
答案 6 :(得分:0)
只需添加
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'junit', module: 'junit'
}
testImplementation 'org.junit.jupiter:junit-jupiter:5.4.2'
并且:
test {
useJUnitPlatform()
}