From ed41686017166371e2661024709be0528fab3241 Mon Sep 17 00:00:00 2001 From: Tatu Saloranta Date: Sun, 16 Oct 2016 13:42:12 -0700 Subject: Fix #1414 --- .../databind/exc/DeserExceptionTypeTest.java | 139 +++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java (limited to 'src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java') diff --git a/src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java b/src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java new file mode 100644 index 000000000..6b5f79aff --- /dev/null +++ b/src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java @@ -0,0 +1,139 @@ +package com.fasterxml.jackson.databind.exc; + +import java.io.*; + +import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.databind.*; +import com.fasterxml.jackson.databind.exc.InputMismatchException; +import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException; + +/** + * Unit test for verifying that exceptions are properly handled (caught, + * re-thrown or wrapped, depending) with Object deserialization, + * including using concrete subtypes of {@link JsonMappingException} + * (or, for low-level parsing, {@link JsonParseException}). + */ +public class DeserExceptionTypeTest + extends BaseMapTest +{ + static class Bean { + public String propX; + } + + // Class that has no applicable creators and thus can not be instantiated; + // definition problem + static class NoCreatorsBean { + public int x; + + // Constructor that is not detectable as Creator + public NoCreatorsBean(boolean foo, int foo2) { } + } + + /* + /********************************************************** + /* Test methods + /********************************************************** + */ + + private final ObjectMapper MAPPER = new ObjectMapper(); + + public void testHandlingOfUnrecognized() throws Exception + { + UnrecognizedPropertyException exc = null; + try { + MAPPER.readValue("{\"bar\":3}", Bean.class); + } catch (UnrecognizedPropertyException e) { + exc = e; + } + if (exc == null) { + fail("Should have failed binding"); + } + assertEquals("bar", exc.getPropertyName()); + assertEquals(Bean.class, exc.getReferringClass()); + // also: should get list of known properties + verifyException(exc, "propX"); + } + + /** + * Simple test to check behavior when end-of-stream is encountered + * without content. Used to expect EOFException (Jackson 1.x); but + * nowadays ought to be JsonMappingException + */ + public void testExceptionWithEmpty() throws Exception + { + try { + Object result = MAPPER.readValue(" ", Object.class); + fail("Expected an exception, but got result value: "+result); + } catch (Exception e) { + verifyException(e, InputMismatchException.class, "No content"); + } + } + + @SuppressWarnings("resource") + public void testExceptionWithIncomplete() + throws Exception + { + BrokenStringReader r = new BrokenStringReader("[ 1, ", "TEST"); + JsonParser p = MAPPER.getFactory().createParser(r); + try { + @SuppressWarnings("unused") + Object ob = MAPPER.readValue(p, Object.class); + fail("Should have gotten an exception"); + } catch (IOException e) { + /* For "bona fide" IO problems (due to low-level problem, + * thrown by reader/stream), IOException must be thrown + */ + verifyException(e, IOException.class, "TEST"); + } + } + + public void testExceptionWithEOF() throws Exception + { + JsonParser p = MAPPER.getFactory().createParser(" 3"); + + Integer I = MAPPER.readValue(p, Integer.class); + assertEquals(3, I.intValue()); + + // and then end-of-input... + try { + I = MAPPER.readValue(p, Integer.class); + fail("Should have gotten an exception"); + } catch (IOException e) { + verifyException(e, InputMismatchException.class, "No content"); + } + // also: should have no current token after end-of-input + JsonToken t = p.getCurrentToken(); + if (t != null) { + fail("Expected current token to be null after end-of-stream, was: "+t); + } + p.close(); + } + + // [databind#1414] + public void testExceptionForNoCreators() throws Exception + { + try { + NoCreatorsBean b = MAPPER.readValue("{}", NoCreatorsBean.class); + fail("Should not succeed, got: "+b); + } catch (JsonMappingException e) { + verifyException(e, InvalidDefinitionException.class, "no Creators"); + } + } + + /* + /********************************************************** + /* Helper methods + /********************************************************** + */ + + void verifyException(Exception e, Class expType, String expMsg) + throws Exception + { + if (e.getClass() != expType) { + fail("Expected exception of type "+expType.getName()+", got "+e.getClass().getName()); + } + if (expMsg != null) { + verifyException(e, expMsg); + } + } +} -- cgit v1.2.3