单元测试中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
相关产品推荐
相关产品推荐

