Spring Boot 2.1.6单元测试无法注入依赖及配置加载问题
Spring Boot测试依赖注入与配置加载问题排查方案
一、MyComponent注入及内部依赖空指针问题解决
核心原因
单独用@Autowired注入MyComponent时出现空指针,是因为测试类未触发Spring上下文加载;用Mockito的@Spy时内部MyClient为空,是因为@Spy仅创建代理对象,不会触发Spring的自动装配逻辑。
解决方案
- 完整加载Spring上下文(推荐,适合需要完整运行方法的场景)
测试类添加@SpringBootTest注解,该注解会启动完整的Spring应用上下文,自动装配所有Bean(包括MyComponent及其依赖的MyClient):
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class MyComponentTest { @Autowired private MyComponent myComponent; @Test public void testTargetMethod() { myComponent.targetMethod(); // 方法完整运行,内部依赖均正常注入 } }
- 保留Spy功能同时注入内部依赖
如果需要对MyComponent的部分方法做模拟,但保留其他依赖的正常注入,使用Spring Boot提供的@SpyBean替代Mockito的@Spy:
import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.SpyBean; @SpringBootTest public class MyComponentSpyTest { @SpyBean private MyComponent myComponent; @Test public void testTargetMethod() { myComponent.targetMethod(); // 内部MyClient不会为空 } }
注意:避免使用Mockito的
@Spy+@InjectMocks组合,该方式仅依赖Mockito的注入逻辑,不支持Spring的@Autowired、@Value注解生效。
二、application.yml配置${api.bah.url}加载为null问题排查
常见原因及解决步骤
- 配置文件位置错误
确保测试环境的application.yml放在src/test/resources目录下,配置内容键名与@Value注解一致:
api: bah: url: "https://your-api-url.com"
- @Value注解写法错误
检查MyComponent中@Value的键名是否与配置文件完全匹配,示例:
@Component public class MyComponent { @Value("${api.bah.url}") private String apiUrl; // ... }
- 测试类未正确加载配置上下文
如果测试类指定了@SpringBootTest(classes = ...)参数,确保包含主启动类(主启动类上的@SpringBootApplication会扫描并加载配置):
@SpringBootTest(classes = YourApplicationMainClass.class) public class MyComponentTest { // ... }
若未指定classes参数,默认会自动扫描主启动类所在包及子包,无需额外配置。
- 占位符依赖外部配置未提供
如果${api.bah.url}依赖环境变量、配置中心等外部配置,测试环境未设置时可通过@TestPropertySource临时指定:
@SpringBootTest @TestPropertySource(properties = {"api.bah.url=https://test-api-url.com"}) public class MyComponentTest { // ... }
- 依赖冲突或配置加载优先级问题
检查是否引入了Spring Cloud Config等外部配置依赖,若未正确配置,可能导致本地application.yml被忽略。可临时移除相关依赖测试,或调整配置加载优先级。
内容的提问来源于stack exchange,提问作者Vinicius Garcia
相关产品推荐
相关产品推荐

