添加spring-kafka-test后Gradle Test Executor执行失败排查
Spring Boot 3.0添加spring-kafka-test后测试启动失败问题排查
问题现象
添加spring-kafka-test依赖后,测试启动失败,抛出如下异常:
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException
根源:java.lang.NoClassDefFoundError: org/junit/platform/launcher/TestExecutionListener
当前项目的Gradle配置如下:
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import org.springframework.boot.gradle.tasks.bundling.BootJar plugins { id("org.springframework.boot") version "3.0.0" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.7.22" kotlin("plugin.spring") version "1.7.22" `maven-publish` `java-test-fixtures` } group = "com.example" version = "0.0.1-SNAPSHOT" java.sourceCompatibility = JavaVersion.VERSION_17 repositories { mavenCentral() } dependencies { api("org.jetbrains.kotlin:kotlin-reflect") api("org.jetbrains.kotlin:kotlin-stdlib-jdk8") api("com.auth0:java-jwt:4.2.1") api("com.fasterxml.jackson.module:jackson-module-kotlin") api("io.github.microutils:kotlin-logging-jvm:3.0.4") api("org.springframework.boot:spring-boot-starter") api("org.springframework.boot:spring-boot-starter-actuator") api("org.springframework.boot:spring-boot-starter-data-mongodb") api("org.springframework.boot:spring-boot-starter-validation") api("org.springframework.boot:spring-boot-starter-security") api("org.springframework.boot:spring-boot-starter-web") api("org.springframework.kafka:spring-kafka") testFixturesApi("org.springframework.boot:spring-boot-starter-test") testFixturesApi("org.springframework.restdocs:spring-restdocs-mockmvc") testFixturesApi("org.springframework.security:spring-security-test") testFixturesApi("org.springframework.kafka:spring-kafka-test") } publishing { publications { create<MavenPublication>("maven") { groupId = project.group.toString() artifactId = project.name version = project.version.toString() from(components["java"]) } } } tasks.getByName<BootJar>("bootJar") { enabled = false } tasks.getByName<Jar>("jar") { enabled = true } tasks.withType<KotlinCompile> { kotlinOptions { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "17" } } tasks.withType<Test> { useJUnitPlatform() }
问题原因
- 依赖作用域配置错误:
testFixturesApi是用于配置**测试夹具(test fixtures)**的依赖,它仅对模块内的测试夹具代码可见,不会自动将依赖传递到普通test任务的类路径中。而spring-kafka-test运行时需要的JUnit Platform Launcher相关类,必须存在于测试任务的类路径才能正常启动测试。 - Spring Boot 3.0依赖版本变化:Spring Boot 3.0对应的JUnit Platform版本升级后,
TestExecutionListener所在的junit-platform-launcher组件被单独拆分,spring-kafka-test依赖该组件但未被正确引入到测试类路径。
修复方案
调整spring-kafka-test的依赖配置,将其添加到testImplementation作用域(如果仅用于普通测试),或者同时保留testFixturesApi并补充junit-platform-launcher依赖:
方案1:仅普通测试使用spring-kafka-test
修改dependencies块中的对应行:
testFixturesApi("org.springframework.boot:spring-boot-starter-test") testFixturesApi("org.springframework.restdocs:spring-restdocs-mockmvc") testFixturesApi("org.springframework.security:spring-security-test") // 移到testImplementation,确保测试任务类路径包含该依赖 testImplementation("org.springframework.kafka:spring-kafka-test")
方案2:测试夹具和普通测试都需要
如果测试夹具代码也要用到spring-kafka-test,可以同时配置两个作用域:
testFixturesApi("org.springframework.boot:spring-boot-starter-test") testFixturesApi("org.springframework.restdocs:spring-restdocs-mockmvc") testFixturesApi("org.springframework.security:spring-security-test") testFixturesApi("org.springframework.kafka:spring-kafka-test") // 补充JUnit Platform Launcher到测试类路径 testImplementation("org.junit.platform:junit-platform-launcher")
修改后重新执行测试任务,即可解决类找不到的问题。
内容的提问来源于stack exchange,提问作者GROX13
相关产品推荐
相关产品推荐

