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

单元测试中Jackson化Blurb对象无法生成可解析JSON的问题

问题:模拟RestServer单元测试中无法生成可解析JSON

我在编写模拟RestServer调用的单元测试时遇到了JSON生成问题,具体情况如下:

定义的Blurb类

@SuperBuilder
@Data
@Setter
@Jacksonized
@JsonIgnoreProperties(ignoreUnknown = true)
public class Blurb {
   String field1;
   String field2;
   String field3;
}

单元测试代码

Blurb blurb = Blurb.builder().build();
System.out.println(blurb);

restServiceServerMock
    .expect(manyTimes(), requestTo("some-url"))
    .andExpect(header(/* 设置请求头 */))
    .andExpect(method(HttpMethod.POST))
    .andExpect(content.json("{'field':'value'}"))
    .andRespond(withSuccess("%s".formatted(blurb), MediaType.APPLICATION_JSON));

// 触发调用Rest服务的方法
someMethodWhichTicklesTheRestService();

运行异常

JSONParseException Unrecognised token 'Blurb' was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'

预期与实际输出

  • 预期JSON格式:
    {
      "field1" : null,
      "field2" : null,
      "field3" : null
    }
    
  • 实际System.out.println(blurb)输出:
    Blurb(field1=null,field2=null,field3=null)
    

我认为注解应该能处理JSON生成,而且允许null值,请问怎么解决这个问题?


解决方案

1. 问题本质

你直接通过String.format或者println输出对象时,调用的是Lombok @Data生成的toString()方法,得到的是类名+字段的字符串,完全不是JSON格式,这才导致了JSON解析异常。

2. 正确的JSON序列化方式

必须用Jackson的ObjectMapper将Java对象序列化为JSON字符串:

// 创建ObjectMapper实例(Spring环境建议直接注入)
ObjectMapper objectMapper = new ObjectMapper();
// 显式配置允许序列化null值(Jackson默认已开启,特殊场景可手动设置)
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
// 将Blurb对象转为JSON字符串
String blurbJson = objectMapper.writeValueAsString(blurb);

3. 修正单元测试的响应代码

把原来的"%s".formatted(blurb)替换为序列化后的JSON字符串:

restServiceServerMock
    .expect(manyTimes(), requestTo("some-url"))
    .andExpect(header(/* 设置请求头 */))
    .andExpect(method(HttpMethod.POST))
    .andExpect(content.json("{'field':'value'}"))
    .andRespond(withSuccess(blurbJson, MediaType.APPLICATION_JSON));

4. 确认Blurb类的注解有效性

你的注解配置是没问题的:

  • @Jacksonized和@SuperBuilder配合,确保Builder生成的对象能被Jackson正确识别
  • @JsonIgnoreProperties(ignoreUnknown = true)仅影响反序列化(忽略未知字段),不干扰序列化
  • @Data包含的toString()只是用于对象的字符串打印,和JSON序列化无关

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:12:49