package com.fasterxml.jackson.databind.seq;
import com.fasterxml.jackson.databind.*;
/**
* Tests to verify aspects of error recover for reading using
* iterator.
*/
public class ReadRecoveryTest extends BaseMapTest
{
static class Bean {
public int a, b;
@Override public String toString() { return "{Bean, a="+a+", b="+b+"}"; }
}
/*
/**********************************************************
/* Unit tests; root-level value sequences via Mapper
/**********************************************************
*/
private final ObjectMapper MAPPER = new ObjectMapper();
public void testRootBeans() throws Exception
{
final String JSON = aposToQuotes("{'a':3} {'x':5}");
MappingIterator<Bean> it = MAPPER.readerFor(Bean.class).readValues(JSON);
// First one should be fine
assertTrue(it.hasNextValue());
Bean bean = it.nextValue();
assertEquals(3, bean.a);
// but second one not
try {
bean = it.nextValue();
fail("Should not have succeeded");
} catch (JsonMappingException e) {
verifyException(e, "Unrecognized field \"x\"");
}
// 21-May-2015, tatu: With [databind#734], recovery, we now know there's no more data!
assertFalse(it.hasNextValue());
it.close();
}
// for [databind#734]
// Simple test for verifying that basic recover works for a case of
// unknown structured value
public void testSimpleRootRecovery() throws Exception
{
final String JSON = aposToQuotes("{'a':3}{'a':27,'foo':[1,2],'b':{'x':3}} {'a':1,'b':2} ");
MappingIterator<Bean> it = MAPPER.readerFor(Bean.class).readValues(JSON);
Bean bean = it.nextValue();
assertNotNull(bean);
assertEquals(3, bean.a);
// second one problematic
try {
it.nextValue();
} catch (JsonMappingException e) {
verifyException(e, "Unrecognized field \"foo\"");
}
// but should recover nicely
bean = it.nextValue();
assertNotNull(bean);
assertEquals(1, bean.a);
assertEquals(2, bean.b);
assertFalse(it.hasNextValue());
it.close();
}
// Similar to "raw" root-level Object sequence, but in array
public void testSimpleArrayRecovery() throws Exception
{
final String JSON = aposToQuotes("[{'a':3},{'a':27,'foo':[1,2],'b':{'x':3}} ,{'a':1,'b':2} ]");
MappingIterator<Bean> it = MAPPER.readerFor(Bean.class).readValues(JSON);
Bean bean = it.nextValue();
assertNotNull(bean);
assertEquals(3, bean.a);
// second one problematic
try {
it.nextValue();
} catch (JsonMappingException e) {
verifyException(e, "Unrecognized field \"foo\"");
}
// but should recover nicely
bean = it.nextValue();
assertNotNull(bean);
assertEquals(1, bean.a);
assertEquals(2, bean.b);
assertFalse(it.hasNextValue());
it.close();
}
}