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

Spring Boot单元测试使用MockMvc请求接口返回Body为null问题咨询

问题根本原因
  • 你测试类中给EmployeeService加了@Mock注解,Mockito创建的Mock对象默认所有非void方法返回值都是null,你没有手动为employeeService.GetSample()方法指定返回逻辑,调用这个方法自然返回null,最终导致接口返回Body为空
  • 你之前尝试的Mockito.when(employeeController.GetEmployee()).thenCallRealMethod()是完全无效的操作:你用@InjectMocks标注的Controller本身就是真实实例,不需要额外指定调用真实方法,你打桩的对象搞错了,应该给依赖的Mock Service打桩才对
修复方案
  1. 删掉冗余的Controller打桩代码,在@Test方法调用接口前,给Mock的Service的GetSample方法指定返回值
  2. 修正测试类中Controller变量名的大小写问题,小驼峰命名避免反射注入异常

修复后的完整测试代码如下:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class EmployeeTestCase {
    private MockMvc mockMvc;

    @InjectMocks
    // 变量名修正为小驼峰
    private EmployeeController employeeController;

    @Mock
    private EmployeeService employeeService;

    @Before
    public void setUp() {
        this.mockMvc = MockMvcBuilders.standaloneSetup(employeeController).build();
    }

    @Test
    public void getEmployee() throws Exception {
        // 新增Service方法打桩逻辑
        Employee mockEmployee = new Employee("Harriet", "random", 25);
        Mockito.when(employeeService.GetSample()).thenReturn(mockEmployee);
        
        this.mockMvc.perform(MockMvcRequestBuilders.post("/info/GetEmployee")).andDo(print());
    }
}

可选补充说明

如果你的测试场景需要调用真实的EmployeeService实现而非Mock对象,只需要将@Mock注解替换为@Autowired,同时删除上面的手动打桩代码即可,不过这属于集成测试范畴,不属于纯单元测试。

内容的提问来源于stack exchange,提问作者Anıl Kırıkkaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:36:07