So erhalten Sie eine JsonProcessingException mit Jackson
Lesezeit: 5 Minuten
Könnte eine seltsame Frage sein, aber in der Tat würde ich gerne ein bisschen mehr Abdeckung bei meinen Tests erreichen und obwohl ich gegen a codiert habe JsonProcessingException Ich kann keine Payload erstellen, die diese Ausnahme generiert, vielleicht weil Jackson ziemlich schlau ist und alles in eine Zeichenfolge konvertiert, und selbst bei schlechten Zeichenfolgen umgeht es die JSON-Spezifikationen. Mein Problem ist, dass Jackson ziemlich gut ist 🙂
Ich möchte im Grunde eine Nutzlast, mit der sie bricht, wenn ich sie ausführe JsonProcessingException:
HashMap<String, String> invalidJSONPayload= new HashMap<>();
invalidJSONPayload.put("021",021);
invalidJSONPayload.put("---",021);
invalidJSONPayload.put("~",021);
Ich bin nicht mit dem Typ beschäftigt, also fühlen Sie sich frei, einen anderen vorzuschlagen. Ein leeres Objekt zum Beispiel throws JsonMappingException und den fange ich auch schon.
Nun, Sie können sich über einen lustig machen ObjectMapper und lassen Sie diese Ausnahme seitdem werfen ObjectMapper ist nicht endgültig
– fg
3. November 2014 um 14:30 Uhr
Wäre das nicht eine Verhöhnung des Tests selbst, ich möchte ein Szenario nachstellen, das tatsächlich im Kontext der laufenden Anwendung passieren kann. Vielleicht ist einer nicht vorhanden? Wenn ja, warum die Ausnahme? Danke für die Antwort.
– bitoiu
3. November 2014 um 15:31 Uhr
Nun, ich dachte, Sie wollten das Verhalten Ihres Codes testen, falls diese Ausnahme ausgelöst wird, weshalb ich dies vorgeschlagen habe
– fg
3. November 2014 um 15:42 Uhr
Ich denke, es macht Sinn, und wenn keine anderen Vorschläge auftauchen, kann ich das genauso gut tun. Ich dachte nur, dass es eine Möglichkeit geben sollte, diese Ausnahme mit einer Art zufälligem Objekt zu erzeugen, das nicht korrekt in JSON analysiert wird. Verdammter Jackson und seine intelligente Analyse.
– bitoiu
3. November 2014 um 16:31 Uhr
Sie könnten versuchen, ihm etwas XML zu geben … 🙂
– Scherb
6. November 2014 um 1:38 Uhr
Lee Passey
Ich wollte dasselbe tun und habe es schließlich erreicht, indem ich die Mockito-Spionagefunktion verwendet habe, die ein echtes Objekt mit einem Scheinobjekt umschließt. Alle Aufrufe an das Scheinobjekt werden an das echte Objekt weitergeleitet, mit Ausnahme der Aufrufe, die Sie verspotten möchten. Zum Beispiel:
ObjectMapper om = Mockito.spy(new ObjectMapper());
Mockito.when( om.writeValueAsString(ErrorObject.class)).thenThrow(new JsonProcessingException("") {});
Alle Verwendungen von om wird von der zugrunde liegenden ObjectMapper-Instanz verarbeitet, bis eine Instanz von ErrorObject übergeben wird, an welcher Stelle die JsonProcessingException wird geworfen.
Das neueJsonProcessingException wird als anonyme Klasse erstellt, da es sich um eine geschützte Klasse handelt und nur eine Unterklasse instanziiert werden kann.
Unter der Annahme, dass das Payload-Objekt öffentliche Getter- und Setter-Methoden hat, könnten Sie einfach spy auf das Payload-Objekt anwenden und dann einen der Getter null zurückgeben lassen. Payload payloadSpy = Mockito.spy(payload); Mockito.doReturn(null).when(payloadSpy).getField(); String jsonPayload = objectMapper.writeValueAsString(payloadSpy);
– pilotg2
2. Oktober 2015 um 17:14 Uhr
das wird werfen Checked exception is invalid for this method! und funktioniert nicht
– Senseiwu
9. Dezember 2018 um 14:38 Uhr
Der JsonProcessingException-Konstruktor hat den Protect-Zugriffsmodifikator. Kann also nicht durch Aufrufen erstellt werden new JsonProcessingException("")
– heemin
24. März 2021 um 3:22 Uhr
Hasel T
Aufbauend auf Liams Antwort, verspottend toString() Methode mit einem Zyklus verursacht auch Jackson zu brechen.
@Test
public void forceJsonParseException() {
try {
Object mockItem = mock(Object.class);
when(mockItem.toString()).thenReturn(mockItem.getClass().getName());
new ObjectMapper().writeValueAsString(mockItem);
fail("did not throw JsonProcessingException");
} catch (JsonProcessingException e) {
//pass
}
}
EDIT: Es ist viel einfacher als das. Ein Mockito-Mock wird es immer werfen. ooh;;
Hat für mich funktioniert. Da das verspottete Element nicht serialisierbar ist, wird die Ausnahme ausgelöst, wenn Sie dieses verspottete Element als Parameter Ihrer getesteten Methode verwenden. Du brauchst die nicht when Klausel btw.
– Julien Feniou
21. Oktober 2020 um 9:46 Uhr
Sie könnten so etwas verwenden:
private static class ClassThatJacksonCannotSerialize {
private final ClassThatJacksonCannotSerialize self = this;
@Override
public String toString() {
return self.getClass().getName();
}
}
Was zu einem führt JsonProcessingException mit Nachricht Direct self-reference leading to cycle (through reference chain: ClassThatJacksonCannotSerialize["self"])
Mit 2.9 konnte ich das nicht replizieren toString überschreiben, ich musste dies tun: private static class WillNotSerialize { public WillNotSerialize getSelf() { return this; } }
– nathansizemore
12. August 2019 um 19:30 Uhr
im Anschluss an die Antwort von @Mike.Mathieson
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
public class JacksonTest {
@Test(expected = JsonProcessingException.class)
// actually throws an InvalidDefinitionException (which extends JsonProcessingException)
public void encodeThrowsException() throws JsonProcessingException {
new ObjectMapper().writeValueAsString(new Object());
}
}
Beachten Sie, dass dieser Test nicht funktioniert, wenn der ObjectMapper so konfiguriert wurde, dass er deaktiviert ist SerializationFeature.FAIL_ON_EMPTY_BEANSz.B
new ObjectMapper()
.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false)
.writeValueAsString(new Object());
Mike Mathieson
Für mich, wenn eine Klasse keine hat public Felder/Methoden, writeValueAsString wird a werfen JsonMappingException (no serializer found for class...)
private static class ClassThatJacksonCannotSerialize {}
private void forceProcessingException() {
ObjectMapper mapper = new ObjectMapper();
try {
return mapper.writeValueAsString(value);
}
catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
Es funktioniert, danke. Habe dies in meinem Test verwendet, um die Throw-Klausel abzudecken :+1:
– Dmitrij Popov
30. Juni 2020 um 13:58 Uhr
heug
Nur für den Fall, dass dies jemandem helfen kann, als ich Einheitentests für eine JsonProcessingException durchgeführt habe, habe ich immer wieder diesen Fehler erhalten:
JsonProcessingException has protected access in com.fasterxml.jackson...
das war mein Code
// error is on the below line
JsonProcessingException e = new JsonProcessingException("borked");
doThrow(e).when(classMock).methodToMock(any(), any());
Ich fand heraus, dass ich nur “{}” als solches hinzufügen musste
JsonProcessingException e = new JsonProcessingException("borked") {};
Es funktioniert, danke. Habe dies in meinem Test verwendet, um die Throw-Klausel abzudecken :+1:
– Dmitrij Popow
30. Juni 2020 um 13:58 Uhr
SHZ
Sie können eine JsonProcessingException erhalten, wenn Sie zwei Felder derselben Eigenschaft zuordnen.
class InvalidObject {
@JsonProperty("s")
private String x = "value1";
@JsonProperty("s")
private String y = "value2";
}
Die Ausnahmemeldung lautet „Mehrere Felder, die die Eigenschaft „s“ darstellen:…“
Dies ist eine super einfache Lösung und sollte als Antwort markiert werden. Klappt wunderbar! Danke dir.
– Tanner
13. Oktober 2022 um 14:20 Uhr
14412500cookie-checkSo erhalten Sie eine JsonProcessingException mit Jacksonyes
Nun, Sie können sich über einen lustig machen
ObjectMapper
und lassen Sie diese Ausnahme seitdem werfenObjectMapper
ist nicht endgültig– fg
3. November 2014 um 14:30 Uhr
Wäre das nicht eine Verhöhnung des Tests selbst, ich möchte ein Szenario nachstellen, das tatsächlich im Kontext der laufenden Anwendung passieren kann. Vielleicht ist einer nicht vorhanden? Wenn ja, warum die Ausnahme? Danke für die Antwort.
– bitoiu
3. November 2014 um 15:31 Uhr
Nun, ich dachte, Sie wollten das Verhalten Ihres Codes testen, falls diese Ausnahme ausgelöst wird, weshalb ich dies vorgeschlagen habe
– fg
3. November 2014 um 15:42 Uhr
Ich denke, es macht Sinn, und wenn keine anderen Vorschläge auftauchen, kann ich das genauso gut tun. Ich dachte nur, dass es eine Möglichkeit geben sollte, diese Ausnahme mit einer Art zufälligem Objekt zu erzeugen, das nicht korrekt in JSON analysiert wird. Verdammter Jackson und seine intelligente Analyse.
– bitoiu
3. November 2014 um 16:31 Uhr
Sie könnten versuchen, ihm etwas XML zu geben … 🙂
– Scherb
6. November 2014 um 1:38 Uhr