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

Spring Boot测试中请求未触发Service方法的问题排查

问题原因分析

你遇到的问题核心是测试类中用@MockBean注解了CategoryService,导致真实的Service实例被Mockito的Mock对象替换,且未给Mock对象的findById方法设置返回值:

  • @MockBean会将Spring容器中的真实CategoryService替换为一个Mockito Mock实例。
  • 你的测试代码仅Mock了CategoryRepository的行为,但没有配置Mock版CategoryService的findById方法返回值,所以当Controller调用该方法时,Mock对象默认返回null,完全不会执行真实Service里的业务逻辑。
解决办法

根据你的测试目标,有两种处理方式:

方式一:仅测试Controller逻辑(无需真实Service执行)

如果你的测试只关注Controller的请求处理、响应封装逻辑,不需要真实Service参与,直接给Mock的CategoryService设置返回值即可:

// 在test_findById方法中,添加以下代码(在perform请求前)
CategoryResponse mockResponse = new CategoryResponse();
mockResponse.setId(123L);
mockResponse.setName("Category");
mockResponse.setOrdinal(1);
when(categoryService.findById(123L)).thenReturn(mockResponse);

方式二:集成测试(使用真实Service)

如果你的测试需要验证真实Service的业务逻辑(比如Repository调用、MapStruct映射),直接删除测试类中的这行代码:

@MockBean
private CategoryService categoryService;

这样Spring会自动注入真实的CategoryService实例,而你已经用@MockBeanMock了CategoryRepository,真实Service会调用Mock的Repository,符合你原本的测试预期。

另外注意:你的CategoryResponseMapper使用@Spy手动实例化,建议改用@SpyBean让Spring管理这个Spy实例,确保它能被正确注入到Service中:

@SpyBean
private CategoryResponseMapper categoryResponseMapper;

内容的提问来源于stack exchange,提问作者Jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 21:27:03