【发布时间】:2014-05-16 02:21:04
【问题描述】:
我在使用 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(以不同的组合,但没有成功)。或者,我是否必须编写自己的自定义序列化程序?
谢谢!
【问题讨论】:
-
他们在代码中!为了便于阅读,我只是将它们排除在外——在这个例子中,它们只是简单地返回私有字段的值。
-
jackson 将使用 getter 方法,但需要遵守命名约定
-
我向你保证,getter / setter 遵循 Java 命名约定。我什至在类中添加了@JsonIgnoreProperties(ignoreUnknown=true),仍然出现StackOverflowError异常。
标签: java json serialization jackson mockito