Spring Boot控制器单元测试报错:无法找到UserRepository Bean
问题排查:Spring Boot控制器单元测试Bean找不到异常
异常信息
Field repository in uk.co.circuare.cube.service.user.api.UserController required a bean of type 'uk.co.circuare.cube.service.user.repository.UserRepository' that could not be found. The injection point has the following annotations: - @org.springframework.beans.factory.annotation.Autowired(required=true) Action: Consider defining a bean of type 'uk.co.circuare.cube.service.user.repository.UserRepository' in your configuration.
相关代码
主类代码
@SpringBootApplication @ComponentScan({ "uk.co.circuare.cube.service.user", "uk.co.circuare.cube.service.user.api", "uk.co.circuare.cube.service.api.advice" }) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
RoleControllerTest代码
@WebMvcTest(controllers = RoleController.class) public class RoleControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper mapper; @MockBean private RoleRepository repository; }
UserControllerTest代码
@WebMvcTest(controllers = UserController.class) public class UserControllerTest { @Autowired private MockMvc mockMvc; @Autowired private ObjectMapper mapper; @MockBean private UserRepository repository; }
问题原因及解决办法
核心原因
主类手动指定的@ComponentScan扫描范围漏掉了UserRepository所在的uk.co.circuare.cube.service.user.repository包。加上@WebMvcTest是切片测试,只会加载控制器相关Bean,不会自动触发Spring Data的Repository自动配置,导致测试上下文无法识别UserRepository类型的Bean(哪怕是你用@MockBean声明的Mock实例)。
具体解决步骤
任选一种即可:
- 删除主类的
@ComponentScan:@SpringBootApplication默认会扫描主类所在包及其所有子包,只要主类在uk.co.circuare.cube或更上层包,user.repository作为子包会被自动扫描。修改后主类:@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } - 补充扫描包到
@ComponentScan:把uk.co.circuare.cube.service.user.repository加入扫描列表:@ComponentScan({ "uk.co.circuare.cube.service.user", "uk.co.circuare.cube.service.user.api", "uk.co.circuare.cube.service.api.advice", "uk.co.circuare.cube.service.user.repository" }) - 测试类指定加载主类配置:给
@WebMvcTest添加classes参数,确保测试上下文加载主类的配置:@WebMvcTest(controllers = UserController.class, classes = Application.class) public class UserControllerTest { // 原有代码保持不变 }
内容的提问来源于stack exchange,提问作者Muhammad Rizwan
相关产品推荐
相关产品推荐

