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

使用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

快速排查步骤

  1. 检查测试代码里有没有把null传给JSON序列化方法
  2. 确认MockMvc的配置是否正确,有没有注入ObjectMapper
  3. 检查Department类是否有正确的序列化配置(无参构造、getter/setter)
  4. 确保Service层的模拟返回值不为null,至少是个空集合

内容的提问来源于stack exchange,提问作者SpringUser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:42:02