2014-11-03 7 views
7

का उपयोग कर जेसनप्रोसेसिंग एक्सेप्शन कैसे प्राप्त करें एक अजीब सवाल हो सकता है लेकिन वास्तव में मैं अपने परीक्षणों पर थोड़ा अधिक कवरेज प्राप्त करना चाहता हूं और हालांकि मैंने JsonProcessingException के खिलाफ कोड किया है, लेकिन मैं इस अपवाद को उत्पन्न करने वाला एक पेलोड नहीं बना सकता, क्योंकि शायद जैक्सन काफी स्मार्ट है और सब कुछ एक स्ट्रिंग में परिवर्तित करता है, और यहां तक ​​कि खराब तारों के लिए भी यह JSON चश्मे के आसपास जाता है। मेरे समस्या यह है कि जैक्सन काफी अच्छा है :)जैक्सन

मैं मूल रूप से एक पेलोड कि जब मैं इस चलाने के लिए, यह JsonProcessingException साथ तोड़ने हैं:

String jsonPayload = objectMapper.writeValueAsString(payload); 

मैं कुछ तरह की कोशिश की है:

HashMap<String, String> invalidJSONPayload= new HashMap<>(); 

invalidJSONPayload.put("021",021); 
invalidJSONPayload.put("---",021); 
invalidJSONPayload.put("~",021); 

मैं इस प्रकार से परेशान नहीं हूं, इसलिए किसी और को सुझाव देने में संकोच न करें। उदाहरण के लिए एक खाली वस्तु, JsonMappingException फेंकता है और मैं पहले से ही इसे पकड़ता हूं।

+1

ठीक है, आप एक 'ObjectMapper' नकली और यह कि फेंक कर सकते हैं 'ऑब्जेक्टमैपर' के बाद अपवाद अंतिम नहीं है – fge

+0

क्या वह परीक्षण का मज़ाक उड़ाएगा, मैं ऐसे परिदृश्य को पुन: उत्पन्न करना चाहता हूं जो वास्तव में चल रहे एप्लिकेशन के संदर्भ में हो सकता है। शायद कोई अस्तित्व में नहीं है? यदि हां, तो अपवाद क्यों? जवाब के लिए धन्यवाद। – bitoiu

+1

ठीक है, मैंने सोचा था कि आप इस अपवाद को उठाए जाने के दौरान अपने कोड के व्यवहार का परीक्षण करना चाहते थे, इसलिए मैंने यह सुझाव दिया कि – fge

उत्तर

7

मैं वही काम करना चाहता था, और अंत में इसे मॉकिटो "जासूस" फ़ंक्शन का उपयोग करके पूरा किया, जो एक मॉक ऑब्जेक्ट के साथ वास्तविक वस्तु को लपेटता है। नकली वस्तु के लिए सभी कॉल वास्तविक वस्तु को अग्रेषित किए जाते हैं, सिवाय इसके कि आप नकल करने की कोशिश कर रहे हैं। उदाहरण के लिए:

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

om के सभी उपयोगों तक ErrorObject का एक उदाहरण में पारित हो जाता है, जिसके आधार पर JsonProcessingException फेंक दिया जाएगा ObjectMapper अंतर्निहित उदाहरण द्वारा नियंत्रित किया जाएगा।

नया JsonProcessingException एक अज्ञात वर्ग के रूप में बनाया गया है, क्योंकि यह एक संरक्षित वर्ग है और केवल एक उप-वर्ग को तत्काल किया जा सकता है।

+0

पेलोड ऑब्जेक्ट को मानते हुए सार्वजनिक गेटर और सेटर विधियां हैं, आप बस पेलोड ऑब्जेक्ट पर जासूसी का उपयोग कर सकते हैं और फिर गेटर्स रिटर्न नल में से एक है। पेलोड payloadSpy = Mockito.spy (पेलोड); Mockito.doReturn (शून्य) .जब (payloadSpy) .getField(); स्ट्रिंग jsonPayload = objectMapper.writeValueAsString (payloadSpy); – pilotg2

2

आप कुछ इस तरह इस्तेमाल कर सकते हैं:

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

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

कौन सा संदेश Direct self-reference leading to cycle (through reference chain: ClassThatJacksonCannotSerialize["self"]) के साथ एक JsonProcessingException में जो परिणाम

1

बिल्डिंग लियाम के जवाब से दूर, एक चक्र के साथ toString() विधि मजाक भी तोड़ने के लिए जैक्सन का कारण बनता है ।

@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 
    } 
} 

संपादित करें: यह उससे आसान तरीका है। एक मॉकिटो मॉक हमेशा इसे फेंक देगा। o.o ;;

2

मेरे लिए एक वर्ग कोई सार्वजनिक क्षेत्रों/तरीकों writeValueAsString एक JsonMappingException फेंक होगा अगर (कोई serializer वर्ग के लिए मिला ...)

private static class ClassThatJacksonCannotSerialize {} 

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