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:

String jsonPayload = objectMapper.writeValueAsString(payload);

Ich habe einige ausprobiert wie:

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

Benutzeravatar von Lee Passey
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

Benutzeravatar von Hazel T
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());
    }
}

https://fasterxml.github.io/jackson-databind/javadoc/2.9/com/fasterxml/jackson/databind/exc/InvalidDefinitionException.html

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());

Benutzeravatar von Mike Mathieson
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

Benutzeravatar von heug
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

Benutzeravatar von SHZ
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


1441250cookie-checkSo erhalten Sie eine JsonProcessingException mit Jackson

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy