aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java
diff options
context:
space:
mode:
authorTatu Saloranta <tatu.saloranta@iki.fi>2016-10-16 13:42:12 -0700
committerTatu Saloranta <tatu.saloranta@iki.fi>2016-10-16 13:42:12 -0700
commited41686017166371e2661024709be0528fab3241 (patch)
treee0d252fc6eb3faafd1ce3ea6379976c33d4699db /src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java
parent6163141d99c2e8a2178c1a7eb2bab7191886f1ca (diff)
downloadjackson-databind-ed41686017166371e2661024709be0528fab3241.tar.gz
Fix #1414
Diffstat (limited to 'src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java')
-rw-r--r--src/test/java/com/fasterxml/jackson/databind/exc/DeserExceptionTypeTest.java139
1 files changed, 139 insertions, 0 deletions
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);
+ }
+ }
+}