SpringBootTest注入Controller依赖项为NULL问题求助
问题场景
使用JUnit4测试SpringBoot REST Controller,测试类通过@Autowired注入的Controller实例非空(说明Spring上下文正常启动),但Controller内部的所有@Autowired依赖项及@Value字段均为null,且未手动通过new创建Controller实例。测试类注解及Gradle依赖如下:
测试类注解:
@RunWith(SpringRunner.class) @SpringBootTest(classes = {MyApplication.class}) @ActiveProfiles({"local", "test"})
Gradle测试依赖:
testImplementation 'junit:junit:4.13.1' testImplementation 'org.junit.vintage:junit-vintage-engine'
注:项目为多模块Gradle构建,测试未跨模块,应用类所在包位于Controller所在包的上层。
排查与解决步骤
确认Controller类的Spring Bean标识
Controller类必须标注@RestController或@Controller注解,否则Spring不会将其纳入Bean管理,内部依赖自然无法注入。同时确保Controller所在包是应用类MyApplication所在包的子包(SpringBoot默认扫描应用类包及其子包),若路径不在默认扫描范围,需在@SpringBootApplication上添加scanBasePackages指定扫描路径,比如:@SpringBootApplication(scanBasePackages = {"com.example.app", "com.example.controller"}) public class MyApplication { ... }检查依赖类的Bean注册状态
Controller内部的依赖类(如Service、Repository)必须标注@Service、@Repository或@Component等注解,让Spring能够扫描并创建对应的Bean。如果是第三方类,需通过@Bean方法在配置类中手动注册为Spring Bean。验证配置文件加载与@Value字段配置
测试类激活了local和test环境,需确认src/test/resources目录下存在application-local.properties(或yml)和application-test.properties(或yml),且@Value绑定的配置键名完全匹配。若配置文件缺失或键名错误,@Value会注入null。补充SpringBoot测试核心依赖
当前Gradle测试依赖仅包含JUnit4和vintage引擎,缺少SpringBoot测试的核心组件,需添加:testImplementation 'org.springframework.boot:spring-boot-starter-test'该依赖包含SpringTest、Mockito等测试必需的组件,缺失会导致Spring上下文初始化不完整,影响依赖注入逻辑。
检查Controller类是否为final
若Controller类被final修饰,Spring无法生成代理类,会导致内部依赖注入失败,需确保Controller类不是final类型。验证上下文Bean完整性
在测试类中注入ApplicationContext,打印所有Bean名称,确认Controller及其依赖的Bean都已被加载到上下文中:@Autowired private ApplicationContext context; @Test public void verifyBeansLoaded() { for (String beanName : context.getBeanDefinitionNames()) { System.out.println(beanName); } }如果依赖Bean不在输出列表中,说明扫描或注册环节存在问题,需重新检查包路径和Bean注解。
内容的提问来源于stack exchange,提问作者Tim Milstead

