You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 04:35:08