使用 Jackson 和 Mockito 序列化对象时的无限递归
2022-09-04 21:11:37
在使用 MockMvc、Mockito 和 Jackson 测试 Spring 控制器时,我遇到了这个问题,所以我做了一个简单的类来测试 Jackson 的行为。我使用的是 jackson-databind:2.3.1 和 mockito-core:1.9.5。
给定此类:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.Serializable;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public class Person implements Serializable {
private String name;
private int age;
// Public getters and setters...
public static void main(String[] args) {
String name = "Bob";
int age = 21;
ObjectMapper objectMapper = new ObjectMapper();
// attempt serialization with real object
Person person = new Person();
person.setName(name);
person.setAge(age);
try {
System.out.println(objectMapper.writeValueAsString(person));
} catch (JsonProcessingException e) {
e.printStackTrace();
System.err.println("Failed to serialize real object");
}
// attempt serialization with mock object
Person mockPerson = mock(Person.class);
when(mockPerson.getName()).thenReturn(name);
when(mockPerson.getAge()).thenReturn(age);
try {
System.out.println(objectMapper.writeValueAsString(mockPerson));
} catch (JsonProcessingException e) {
e.printStackTrace();
System.err.println("Failed to serialize mock object.");
}
}
Jackson 对序列化真实对象没有问题,但是当它尝试序列化模拟对象时,它会抛出 JsonMappingException。通过代码进行调试,它反复调用serializeFields(bean,jgen,provider),卡在内部Mockito属性上。
所以,我的问题是:有没有办法强迫杰克逊使用getter方法?我尝试在类上@JsonIgnoreProperties,在字段上@JsonIgnore,在方法上@JsonProperty(以不同的组合,但没有成功)。或者,我是否必须编写自己的自定义序列化程序?
谢谢!