You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin Spring Boot测试:@ExtendWith无法初始化@Value变量的原因与解决

问题原因与解决方案

为什么@ExtendWith会失效?

核心问题是JUnit版本冲突:

  • Spring Boot 3.2.0默认依赖JUnit 5(5.9.3),但kotlin-test默认引入了JUnit 4.13.2,导致类路径同时存在两个版本的JUnit API。
  • @RunWith(SpringRunner::class)是JUnit 4的注解,能触发JUnit 4运行器正常整合Spring上下文完成依赖注入;而@ExtendWith(SpringExtension::class)是JUnit 5的注解,由于类路径里的JUnit 4干扰,测试运行环境没有正确启用JUnit 5的上下文初始化逻辑,Spring容器没启动,@Value标注的变量自然无法完成注入。

最简洁的注解方案

第一步:解决依赖冲突

在Gradle的build.gradle.kts中,直接改用适配JUnit 5的Kotlin测试库(替代原kotlin-test),彻底避免JUnit 4的干扰:

testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")

或者如果坚持用kotlin-test,就排除它自带的JUnit 4依赖:

testImplementation("org.jetbrains.kotlin:kotlin-test") {
    exclude(group = "junit", module = "junit")
}

第二步:使用最简注解组合

Spring Boot 3.x中,@SpringBootTest已经默认包含@ExtendWith(SpringExtension::class),不需要额外添加该注解。直接在测试类上标注@SpringBootTest即可,Spring会自动启动上下文并完成@Value变量的注入:

import org.springframework.boot.test.context.SpringBootTest
import org.springframework.beans.factory.annotation.Value
import org.junit.jupiter.api.Test

@SpringBootTest
class YourBatchTest {
    @Value("\${jira.user}")
    lateinit var jiraUser: String

    @Test
    fun testJiraUserInjected() {
        println(jiraUser)
    }
}

这样既解决了版本冲突,又用最简洁的注解实现了依赖注入,测试就能正常运行。

内容的提问来源于stack exchange,提问作者ChrLipp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 00:02:12