使用JUnit和Mockito编写Controller测试时遇JSON非空错误求助
解决JUnit+Mockito测试Controller时的"JSON can not be null or empty"错误
嘿,我来帮你排查这个问题!结合你给出的DepartmentController代码片段和测试场景,大概率是测试代码在JSON处理环节出了问题,下面是几个常见的坑和解决办法:
可能的错误场景及修复方案
1. 测试时传递了null给JSON序列化方法
如果你的测试代码里用ObjectMapper序列化对象时传了null,或者用MockMvc验证响应时错误处理了空内容,就会触发这个错误。比如:
// 错误示例:序列化null对象 String json = objectMapper.writeValueAsString(null);
修复方式:
- 确保要序列化的对象不为空,哪怕是个空集合也行
- 要是确实需要处理null,可以给
ObjectMapper配置允许序列化null值:
objectMapper.configure(SerializationFeature.WRITE_NULL_MAP_VALUES, true); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
2. MockMvc配置不到位,JSON处理失败
如果你的测试类没正确配置MockMvc,比如没加@WebMvcTest注解,或者没注入ObjectMapper,就可能在处理响应JSON时出问题。
给你个标准的Controller测试类模板参考:
@WebMvcTest(DepartmentController.class) public class DepartmentControllerTest { @Autowired private MockMvc mockMvc; @MockBean private DepartmentService depService; @Autowired private ObjectMapper objectMapper; @Test public void findDepName_ShouldReturnDepartments() throws Exception { // 先模拟Service返回的部门数据 Set<Department> mockDepartments = new HashSet<>(); mockDepartments.add(new Department(1L, "研发部")); when(depService.findDepName()).thenReturn(mockDepartments); // 发送GET请求并验证响应 mockMvc.perform(get("/api.spacestudy.com/SpaceStudy/Control/SearchFilter/loadDepartments") .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(content().contentType(MediaType.APPLICATION_JSON)) .andExpect(jsonPath("$", hasSize(1))) .andExpect(jsonPath("$[0].name").value("研发部")); } }
这里要注意:
- 用
@WebMvcTest专注测试Controller层,Spring会自动配置MockMvc和ObjectMapper - 用
@MockBean模拟依赖的DepartmentService,避免依赖真实的业务实现
3. Department类缺少序列化必要的配置
Jackson(Spring默认的JSON处理库)需要类有无参构造函数,以及getter/setter方法,否则没法正常序列化/反序列化对象,也可能导致JSON处理时抛出空相关的错误。
修复Department类:
// 用Lombok的@Data注解自动生成getter、setter、无参构造等 @Data public class Department { private Long id; private String name; // 要是不用Lombok,就手动加无参构造 public Department() {} public Department(Long id, String name) { this.id = id; this.name = name; } }
4. Service层模拟返回null导致响应JSON为空
如果你的测试用例里写了when(depService.findDepName()).thenReturn(null);,那Controller返回的ResponseEntity的body就是null,这时测试代码如果期望有JSON内容,就会触发“JSON can not be null or empty”错误。
修复方式:
确保模拟Service返回非空的集合,哪怕是空集合也比null强:
when(depService.findDepName()).thenReturn(new HashSet<>()); // 返回空集合而非null
快速排查步骤
- 检查测试代码里有没有把null传给JSON序列化方法
- 确认
MockMvc的配置是否正确,有没有注入ObjectMapper - 检查
Department类是否有正确的序列化配置(无参构造、getter/setter) - 确保Service层的模拟返回值不为null,至少是个空集合
内容的提问来源于stack exchange,提问作者SpringUser
相关产品推荐
相关产品推荐

