2014-11-03 4 views
7

Könnte eine seltsame Frage sein, aber in der Tat möchte ich ein bisschen mehr Berichterstattung über meine Tests erreichen und obwohl ich gegen eine JsonProcessingException codiert habe, kann ich keine Nutzlast erstellen, die diese Ausnahme erzeugt, vielleicht weil Jackson ist ziemlich schlau und konvertiert alles zu einer Saite, und selbst bei schlechten Saiten geht es um die JSON-Spezifikationen herum. Mein Problem ist, dass Jackson ist ziemlich gut :)Wie bekomme ich eine JsonProcessingException mit Jackson

Ich möchte im Grunde eine Nutzlast, wenn ich dieses laufen, brechen mit JsonProcessingException:

String jsonPayload = objectMapper.writeValueAsString(payload); 

Ich habe versucht, etwas 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 zögern Sie nicht, einen anderen vorzuschlagen. Ein leeres Objekt zum Beispiel wirft JsonMappingException und ich fange das auch schon.

+1

Nun können Sie eine 'ObjectMapper' verspotten und haben es, dass werfen werfen Ausnahme, da 'ObjectMapper' nicht endgültig ist – fge

+0

Wäre das nicht der Test selbst, würde ich gerne ein Szenario reproduzieren, das tatsächlich im Kontext der laufenden Anwendung passieren kann. Vielleicht existiert einer nicht? Wenn ja, warum die Ausnahme? Danke für die Antwort. – bitoiu

+1

Nun, ich dachte, Sie wollten das Verhalten Ihres Codes für den Fall, dass diese Ausnahme ausgelöst wurde, testen, weshalb ich vorgeschlagen – fge

Antwort

7

Ich wollte das Gleiche tun und schaffte es schließlich mit der Mockito "Spion" -Funktion, die ein echtes Objekt mit einem Mock-Objekt umschließt. Alle Aufrufe an das Mock-Objekt werden an das reale Objekt weitergeleitet, außer an diejenigen, die Sie versuchen zu verhöhnen. Zum Beispiel:

ObjectMapper om = Mockito.spy(new ObjectMapper); 
Mockito.when(om.writeValueAsString(ErrorObject.class)).thenThrow(new JsonProcessingException("") {}); 

Alle Verwendungen von om werden von der zugrunde liegenden ObjectMapper Instanz, bis eine Instanz von ErrorObject wird eingeleitet, bei dem die JsonProcessingException geworfen wird Punkt behandelt werden. Die neue JsonProcessingException wird als anonyme Klasse erstellt, da es sich um eine geschützte Klasse handelt und nur eine Unterklasse instanziiert werden kann.

+0

Angenommen, das Payload-Objekt verfügt über öffentliche Getter- und Setter-Methoden, können Sie einfach das Payload-Objekt ausspionieren und dann einen der Getter null zurückgeben lassen. Nutzlast payloadSpy = Mockito.spy (Nutzlast); Mockito.doReturn (null) .when (payloadSpy) .getField(); Zeichenfolge jsonPayload = objectMapper.writeValueAsString (payloadSpy); – pilotg2

2

Sie so etwas wie dies nutzen könnten:

private static class ClassThatJacksonCannotSerialize { 
    private final ClassThatJacksonCannotSerialize self = this; 

    @Override 
    public String toString() { 
     return self.getClass().getName(); 
    } 
} 

, die in einem JsonProcessingException mit Nachricht Direct self-reference leading to cycle (through reference chain: ClassThatJacksonCannotSerialize["self"])

1

Gebäude weg von Liams Antwort führt, mit einem Zyklus der toString() Methode spöttischen 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-Spott wird es immer werfen. o.o ;;

2

Für mich, wenn eine Klasse keine öffentlichen Felder/Methoden writeValueAsString hat eine JsonMappingException (keine Serializer für Klasse ... gefunden)

private static class ClassThatJacksonCannotSerialize {} 

private void forceProcessingException() { 
    ObjectMapper mapper = new ObjectMapper(); 
     try { 
      return mapper.writeValueAsString(value); 
     } catch (JsonProcessingException e) { 
      throw new RuntimeException(e); 
     } 
} 
Verwandte Themen