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
相关产品推荐
相关产品推荐

