Spring Boot MockMvc测试:如何正确Mock注入StrategyRepository?
解决Spring Boot MockMvc测试中JPA Metamodel为空的问题
报错原因
你遇到的JPA metamodel must not be empty错误,是因为@WebMvcTest启动测试上下文时,会加载部分Spring自动配置。如果你的项目启用了JPA审计(比如配置了@EnableJpaAuditing),Spring会尝试创建jpaAuditingHandler bean,但WebMvcTest场景下不会加载JPA实体类的元数据,导致初始化失败。
解决方案
方案一:排除不必要的自动配置(推荐)
修改测试类的@WebMvcTest注解,排除JPA和审计相关的自动配置,避免Spring尝试初始化JPA相关组件:
@WebMvcTest(value = StrategyController.class, excludeAutoConfiguration = {JpaAutoConfiguration.class, AuditingAutoConfiguration.class}) class StrategyControllerTest { @MockBean private StrategyService strategyService; @Autowired MockMvc mockMvc; @Test void showStrategyDetails() throws Exception { long strategyId = 2L; mockMvc .perform(get("/showStrategyDetails/{strategyId}", strategyId)) // 注意路径前加斜杠 .andExpect(status().isOk()); } }
另外,@WebMvcTest已经集成了Mockito的支持,所以可以去掉@ExtendWith(MockitoExtension.class),简化代码。
方案二:Mock StrategyRepository
如果不想排除自动配置,也可以直接给StrategyRepository添加@MockBean,让Spring使用Mock实例替代真实的Repository:
@WebMvcTest(StrategyController.class) class StrategyControllerTest { @MockBean private StrategyService strategyService; @MockBean private StrategyRepository strategyRepository; // 新增MockRepository @Autowired MockMvc mockMvc; @Test void showStrategyDetails() throws Exception { long strategyId = 2L; mockMvc .perform(get("/showStrategyDetails/{strategyId}", strategyId)) .andExpect(status().isOk()); } }
额外提示
测试中的请求路径要确保正确,记得在路径前加上斜杠/,否则可能会因为路径匹配失败导致测试不通过。
内容的提问来源于stack exchange,提问作者Krzysztof Michalski
相关产品推荐
相关产品推荐

