@WebFluxTest集成测试找不到Bean报r2dbcEntityTemplate缺失怎么解决
问题根因
@WebFluxTest 是Web层切片测试注解,默认仅加载Controller相关的Bean,不会加载R2dbc持久层相关的自动配置。但你的启动类上标注了@EnableR2dbcRepositories,该注解会在Spring上下文初始化时扫描全局的R2dbc Repository接口,包括报错中的SkillGroupRepository,这个Repository依赖r2dbcEntityTemplate,而切片测试上下文中没有该Bean,因此抛出初始化失败异常。你添加@SpringExtension没有效果是因为@WebFluxTest默认已经集成了该扩展,重复添加不会生效。
解决方案
方案1:限制测试时Repository的扫描范围
在测试类上新增@EnableR2dbcRepositories注解,明确指定仅扫描你需要的Repository,避免扫描到无关的SkillGroupRepository:
@WebFluxTest(controllers = IndexContoller.class) @Import(UserServiceImpl.class) // 仅扫描UserRepo所在的类/包,不会触发其他Repository的初始化 @EnableR2dbcRepositories(basePackageClasses = UserRepo.class) class IndexContollerTest { // 原有测试代码保持不变 }
方案2:Mock无关的Repository
如果你的测试不需要用到任何真实的Repository能力(你已经Mock了UserRepo),可以直接把扫描到的无关Repository用@MockBean注解Mock掉,Spring就不会尝试初始化真实的Repository实例:
@WebFluxTest(controllers = IndexContoller.class) @Import(UserServiceImpl.class) class IndexContollerTest { private static final String PATH = "/"; private static final String ADD_USER = "/signup"; @MockBean private UserRepo userRepo; // 新增Mock注解,避免初始化真实的SkillGroupRepository @MockBean private SkillGroupRepository skillGroupRepository; @Autowired private WebTestClient webClient; @Autowired private ReactiveUserDetailsService userService; // 原有测试方法保持不变 }
如果存在其他被扫描到的无关Repository,依次添加对应的@MockBean即可。
方案3:引入R2dbc测试自动配置
如果你需要在测试中用到真实的R2dbc能力,可以给测试类添加R2dbc相关的自动配置注解,同时引入嵌入式R2dbc数据库(比如H2的R2dbc驱动)作为测试依赖:
@WebFluxTest(controllers = IndexContoller.class) @Import(UserServiceImpl.class) @AutoConfigureR2dbcRepositories @AutoConfigureDataR2dbc class IndexContollerTest { // 原有测试代码保持不变 }
内容的提问来源于stack exchange,提问作者tarmogoyf
相关产品推荐
相关产品推荐

