blob: 3b794c251006460a50be621e1a5482c9c0a5ca3a [file] [log] [blame]
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.MismatchedInputException;
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 cannot 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, MismatchedInputException.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, MismatchedInputException.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);
}
}
}