Ich stieß auf dieses Problem beim Testen eines Spring-Controllers mit MockMvc, Mockito und Jackson, also machte ich eine einfache Klasse, um zu testen, wie Jackson sich verhält. Ich benutze Jackson-Databind: 2.3.1 und Mockito-Core: 1.9.5.Unendliche Rekursion beim Serialisieren von Objekten mit Jackson und Mockito
diese Klasse Gegeben:
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 hat kein Problem, das reale Objekt Serialisierung, aber es wird eine JsonMappingException werfen, wenn es die verspottete Objekt serialisiert werden versucht. Beim Debuggen durch den Code ruft es serializeFields (bean, jgen, provider) wiederholt auf und bleibt auf den internen Mockito-Eigenschaften stecken.
Also, meine Frage ist: Gibt es sowieso Jackson zu zwingen, die Getter-Methoden zu verwenden? Ich habe versucht @ JsonIgnoreProperties für die Klasse, @ JsonIgnore für die Felder und @ JsonProperty für die Methoden (in verschiedenen Kombinationen, ohne Erfolg). Oder muss ich meinen eigenen benutzerdefinierten Serializer schreiben?
Danke!
Wo sind Ihre Getter-Methoden? –
Sie sind im Code! Ich habe sie einfach aus Gründen der Lesbarkeit ausgeschlossen - sie geben einfach den Wert des privaten Feldes in diesem Beispiel zurück. –
jackson wird die Getter-Methode verwenden, aber diese müssen sich an die Namenskonventionen halten –