Spring Boot 2.7.8升级后单元测试Repository自动注入失败问题排查
问题分析与修复方案
错误原因
- 测试上下文加载范围受限:你的
BaseTest类中@SpringBootTest注解指定了classes = {MyService.class},这会让Spring仅初始化与MyService直接关联的Bean,LocationRepository所在的包或类不在这个受限加载范围内,导致Spring无法扫描并实例化该Repository,最终@Autowired注入时返回null。 - 过时注解(次要):Spring Boot 2.7.x中
@WebAppConfiguration已被标记为过时,虽不会直接引发注入失败,但不符合当前版本的最佳实践。
修复方案
方案一:扩展测试上下文加载范围(推荐)
将@SpringBootTest的classes参数替换为项目主启动类(如MyApplication.class),主启动类自带的@SpringBootApplication注解会自动开启组件扫描、Repository扫描等功能,确保所有所需Bean都能被加载:
@SpringBootTest(classes = {MyApplication.class}, properties = { "order.notification.email.type=HTML", "aws.paramstore.enabled=false", "spring.main.banner-mode=off", "spring.mongodb.embedded.version=4.4.0" })
方案二:显式导入Repository或配置类
若不想加载完整应用上下文,可在BaseTest中通过@Import显式导入LocationRepository,或用@EnableMongoRepositories指定Repository所在包路径:
// 方式1:直接导入Repository @Import(LocationRepository.class) // 方式2:指定Repository扫描包 @EnableMongoRepositories(basePackages = "com.yourpackage.repository")
方案三:确认Repository定义正确性
检查LocationRepository是否正确继承Spring Data MongoDB的MongoRepository接口,显式标注@Repository注解(Spring Data会自动识别继承Repository接口的类,但显式标注更清晰):
@Repository public interface LocationRepository extends MongoRepository<Location, String> { // 自定义查询方法 }
额外优化:移除过时注解
你已添加@AutoConfigureMockMvc,它是Spring Boot测试中模拟Web环境的标准方式,可直接移除@WebAppConfiguration注解。
内容的提问来源于stack exchange,提问作者Tharindu Rangana
相关产品推荐
相关产品推荐

