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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:06:24