Unendliche Rekursion beim Serialisieren von Objekten mit Jackson und Mockito

8

Ich bin auf dieses Problem gestoßen, als ich einen Spring-Controller mit MockMvc, Mockito und Jackson getestet habe, also habe ich einen einfachen Kurs gemacht, um herauszufinden, wie Jackson sich verhält. Ich benutze Jackson-Databind: 2.3.1 und Mockito-Core: 1.9.5.

Gegeben diese Klasse:

%Vor%

Jackson hat kein Problem damit, das reale Objekt zu serialisieren, aber es wird eine JsonMappingException auslösen, wenn es versucht, das mokierte Objekt zu serialisieren. 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 irgendjemanden, der Jackson zwingt, die Getter-Methoden zu benutzen? 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!

    
Matthew Serrano 04.04.2014, 00:34
quelle

2 Antworten

5

Hier ist eine Lösung, die für Ihren speziellen Fall funktioniert:

Zunächst müssen Sie eine PersonMixin erstellen, da Sie die erforderlichen Anmerkungen nicht zum Mock hinzufügen können.

%Vor%

Verwenden Sie nun den Objekt-Mapper wie im folgenden Code und Sie erhalten das gleiche Ergebnis wie beim Serialisieren des realen Objekts:

%Vor%     
geoand 05.04.2014, 16:23
quelle
3
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ qstnhdr ___ Unendliche Rekursion beim Serialisieren von Objekten mit Jackson und Mockito ___ answer22883515 ___

Hier ist eine Lösung, die für Ihren speziellen Fall funktioniert:

Zunächst müssen Sie eine PersonMixin erstellen, da Sie die erforderlichen Anmerkungen nicht zum Mock hinzufügen können.

%Vor%

Verwenden Sie nun den Objekt-Mapper wie im folgenden Code und Sie erhalten das gleiche Ergebnis wie beim Serialisieren des realen Objekts:

%Vor%     
___ tag123serialization ___ Serialisierung ist der Prozess, mit dem Datenstrukturen in ein Format konvertiert werden, das leicht gespeichert oder übertragen und anschließend rekonstruiert werden kann. ___ antwort43864854 ___

Hier ist meine ObjectMapper , die es ohne Mixing aussortiert hat.

Der Mapper ignoriert alle Mitglieder, die "Mockito" irgendwo in ihrem Namen haben.

Diese Lösung vermeidet das Mischen für jedes serialisierte Objekt oder das Kommentieren von Code, auf den möglicherweise nicht zugegriffen werden kann.

Der folgende Test ist erfolgreich mit der Ausgabe {"name":"Jonh"} .

%Vor%     
___ qstntxt ___

Ich bin auf dieses Problem gestoßen, als ich einen Spring-Controller mit MockMvc, Mockito und Jackson getestet habe, also habe ich einen einfachen Kurs gemacht, um herauszufinden, wie Jackson sich verhält. Ich benutze Jackson-Databind: 2.3.1 und Mockito-Core: 1.9.5.

Gegeben diese Klasse:

%Vor%

Jackson hat kein Problem damit, das reale Objekt zu serialisieren, aber es wird eine JsonMappingException auslösen, wenn es versucht, das mokierte Objekt zu serialisieren. 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 irgendjemanden, der Jackson zwingt, die Getter-Methoden zu benutzen? 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!

    
___ tag123mockito ___ Mockito ist ein spöttisches Framework für Java. Es wurde von EasyMock inspiriert, zielt jedoch darauf ab, das Probedrucken, die Verifizierung und die Werkzeugausstattung noch weiter zu vereinfachen. ___ tag123json ___ JSON (JavaScript Object Notation) ist ein Textdatenaustauschformat und sprachunabhängig. Verwenden Sie dieses Tag, wenn dieses Textformat beteiligt ist. VERWENDEN SIE DIESEN TAG NICHT FÜR NATIVE JAVASCRIPT-OBJEKTE ODER JAVASCRIPT OBJECT LITERALS. Bevor Sie eine Frage stellen, wenn Sie glauben, dass Ihr JSON gültig ist, überprüfen Sie diese bitte in einem JSON-Validator wie JSONLint, damit Ihre Frage beantwortet wird, bevor Sie sie überhaupt stellen. ___ tag123jackson ___ Jackson ist eine Java-Bibliothek für Aufgaben wie Lesen und Schreiben (Parsen / Generieren) und Datenbindung an / von Java-Objekten. Obwohl Jackson hauptsächlich für JSON verwendet wird, unterstützt Jackson auch viele andere Datenformate wie Avro, CBOR, CSV, Java-Eigenschaften, Protobuf, Smile, XML und YAML. ___
Ahmad Shahwan 09.05.2017 08:30
quelle