Spring Boot单元测试使用MockMvc请求接口返回Body为null问题咨询
问题根本原因
- 你测试类中给
EmployeeService加了@Mock注解,Mockito创建的Mock对象默认所有非void方法返回值都是null,你没有手动为employeeService.GetSample()方法指定返回逻辑,调用这个方法自然返回null,最终导致接口返回Body为空 - 你之前尝试的
Mockito.when(employeeController.GetEmployee()).thenCallRealMethod()是完全无效的操作:你用@InjectMocks标注的Controller本身就是真实实例,不需要额外指定调用真实方法,你打桩的对象搞错了,应该给依赖的Mock Service打桩才对
修复方案
- 删掉冗余的Controller打桩代码,在
@Test方法调用接口前,给Mock的Service的GetSample方法指定返回值 - 修正测试类中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
相关产品推荐
相关产品推荐

