
Spock 测试中 @Autowired 的被测对象为 null,根本原因是 Spock 旧版本不兼容 Spring Boot 3 / Spring 6 的上下文初始化机制;升级至 Spock 2.4-M1 可彻底解决该问题。
spock 测试中 `@autowired` 的被测对象为 null,根本原因是 spock 旧版本不兼容 spring boot 3 / spring 6 的上下文初始化机制;升级至 spock 2.4-m1 可彻底解决该问题。
在基于 Spring Boot 3(或 Spring Framework 6)的项目中使用 Spock 进行集成测试时,开发者常遇到 @SpringBootTest 注解未生效、Spring 应用上下文未启动、@Autowired 字段始终为 null 的问题——即使测试类结构看似正确,如以下典型场景:
@SpringBootTest
class BeerControllerTest extends Specification {
@Autowired
BeerController testSubject // ← 此处运行时为 null
def "get beer by ID"() {
when:
def result = testSubject.getBeerById(UUID.randomUUID())
then:
result != null
println result
}
}该问题并非配置遗漏或注解误用,而是源于 Spock 2.3 及更早版本与 Spring Boot 3 引入的 Jakarta EE 命名空间、ApplicationContextInitializer 签名变更、以及 TestContextManager 集成逻辑不兼容所致。具体表现为:测试执行时 Spring 上下文完全未加载,@Autowired 字段跳过依赖注入流程,直接保留默认值 null。
✅ 解决方案:升级 Spock 至 2.4-M1 或更高版本
Spock 2.4-M1(2022年12月发布)正式支持 Spring Boot 3 / Spring Framework 6,修复了 spock-spring 模块中 SpringExtension 与新版 TestContextManager 的协同问题。升级后,@SpringBootTest 将正常触发上下文刷新,@Autowired 字段可被正确注入。
Maven 依赖示例(pom.xml):
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<version>2.4-M1-groovy-4.0</version> <!-- 注意:需匹配 Groovy 版本 -->
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>⚠️ 关键注意事项:
Groovy 版本对齐:Spock 2.4-M1 要求 Groovy ≥ 4.0,若项目使用 Groovy 3.x,需同步升级(Spring Boot 3 默认兼容 Groovy 4)。
避免混合版本:确保 spock-core 与 spock-spring 版本严格一致(如均使用 2.4-M1-groovy-4.0),否则可能引发 NoClassDefFoundError 或扩展注册失败。
-
验证上下文是否启动:可在测试中添加断言确认上下文状态:
@Autowired ApplicationContext applicationContext def "context should be active"() { expect: applicationContext.isActive() == true applicationContext.getBean(BeerController.class) != null }
? 总结:此问题本质是框架演进过程中的兼容性断层,而非用户代码缺陷。升级 Spock 是唯一可靠解法。建议在 Spring Boot 3 项目中将 Spock 版本锁定为 2.4-M1 或后续稳定版(如 2.4-GA),并持续关注 Spock 官方发行说明 中关于 Spring 集成的更新日志。










