Mockito未返回预期值:Spring Boot控制器测试Mock失效求助
问题根源分析
你错误地Mock了MainController本身,导致测试时调用的是Mock控制器的空实现方法,而非真实的控制器业务逻辑——这直接导致你对anotherService的Mock配置完全没有机会被执行。同时@AutoConfigureMockMvc已经自动配置了MockMvc,不需要手动在setup方法中重新构建。
修正方案
方案一:基于Spring容器的集成测试(推荐)
保留完整Spring上下文,让Spring实例化真实控制器并自动注入Mock依赖:
@SpringBootTest @AutoConfigureMockMvc public class TestMainController { // 注入真实控制器实例,无需Mock @Autowired private MainController mainController; // Mock控制器的依赖服务,Spring会自动将此Mock实例注入控制器 @MockBean private AnotherServiceImpl anotherService; // 使用@AutoConfigureMockMvc自动配置的MockMvc @Autowired private MockMvc mockMvc; @Test public void testFirstFunctionFor201() throws Exception { // 传入合法的JSON字符串,确保能反序列化为RequestObject String req = "{\"name\": \"test\"}"; // 配置Mock服务的返回值 when(anotherService.someFunction(Mockito.anyString())).thenReturn("Success"); this.mockMvc.perform(put("/Main/one") .contentType(MediaType.APPLICATION_JSON) .content(req)) .andExpect(status().isCreated()); } }
方案二:轻量级独立测试(不启动完整Spring上下文)
手动实例化真实控制器并注入Mock依赖,适合快速单元测试:
@RunWith(SpringRunner.class) public class TestMainController { private MainController mainController; private AnotherServiceImpl anotherService; private MockMvc mockMvc; @Before public void setup() { // 创建Mock依赖服务 anotherService = Mockito.mock(AnotherServiceImpl.class); // 实例化真实控制器并注入Mock依赖(需确保控制器支持setter/构造方法注入) mainController = new MainController(); mainController.setAnotherService(anotherService); // 构建独立的MockMvc mockMvc = MockMvcBuilders.standaloneSetup(mainController).build(); } @Test public void testFirstFunctionFor201() throws Exception { String req = "{\"name\": \"test\"}"; when(anotherService.someFunction(Mockito.anyString())).thenReturn("Success"); this.mockMvc.perform(put("/Main/one") .contentType(MediaType.APPLICATION_JSON) .content(req)) .andExpect(status().isCreated()); } }
额外注意事项
- 确保
MainController中的anotherService是通过Spring注入的(如@Autowired或构造方法注入),这样Mock实例才能被正确替换。 - 测试方法名遵循Java规范,首字母小写(如
testFirstFunctionFor201)。 - 传入的JSON字符串必须合法,能正确反序列化为
RequestObject,否则会因参数解析失败返回400状态码,干扰测试结果。
内容的提问来源于stack exchange,提问作者BefuddledBarberian
相关产品推荐
相关产品推荐

