JUnit5 Spring单元测试依赖注入为null问题排查求助
问题原因及解决方案
核心问题:静态字段无法被Spring注入
你的TransactionServiceImpl service被声明为static,Spring的依赖注入机制仅针对类的实例成员生效。静态变量属于类本身,不属于任何实例对象,因此Spring容器不会对静态字段执行注入操作——这就是所有方法里service均为null的根本原因。
修复步骤
- 移除
static修饰符,将service改为实例成员:
@Autowired private TransactionServiceImpl service; // 去掉static修饰符
- 适配
@BeforeAll方法(若需类级初始化)@BeforeAll要求方法为static,但实例成员无法在静态方法中直接调用。如果需要在所有测试前执行依赖service的初始化逻辑,可采用以下两种方式:- 方式一:改用
@BeforeEach(适合无需类级别全局初始化的场景) - 方式二:通过
@TestInstance指定类级实例生命周期,让@BeforeAll支持非静态方法:
- 方式一:改用
@SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) // 添加该注解 public class ProcessorUT { @Autowired private TransactionServiceImpl service; @BeforeAll public void initBeforeAll(){ // 此时service可正常调用 } }
额外优化点
Spring Boot 2.7.x版本中,@SpringBootTest已自动集成@ExtendWith(SpringExtension.class)的功能,你可以删除该注解以简化代码。
依赖配置验证
你的Maven依赖配置是正常的,spring-boot-starter-test已包含JUnit5及Spring测试所需的全部依赖,无需额外调整。
内容的提问来源于stack exchange,提问作者Touchstone
相关产品推荐
相关产品推荐

