ErrorThrowingDeserializerTest.java
package tools.jackson.databind.deser;
import org.junit.jupiter.api.Test;
import tools.jackson.core.*;
import tools.jackson.databind.*;
import tools.jackson.databind.deser.impl.ErrorThrowingDeserializer;
import tools.jackson.databind.module.SimpleModule;
import static org.junit.jupiter.api.Assertions.*;
import static tools.jackson.databind.testutil.DatabindTestUtil.newJsonMapper;
/**
* Tests for {@link ErrorThrowingDeserializer}.
*/
public class ErrorThrowingDeserializerTest
{
static class MyValue {
public int x;
}
// Verify that deserialize() re-throws the stored Error
@Test
public void testDeserializeThrowsError() throws Exception
{
NoClassDefFoundError error = new NoClassDefFoundError("com.example.Missing");
ErrorThrowingDeserializer deser = new ErrorThrowingDeserializer(error);
// Just need a parser instance; content does not matter since
// ErrorThrowingDeserializer immediately throws
ObjectMapper mapper = newJsonMapper();
try (JsonParser p = mapper.createParser("{\"x\":1}")) {
NoClassDefFoundError thrown = assertThrows(NoClassDefFoundError.class,
() -> deser.deserialize(p, null));
assertSame(error, thrown);
assertEquals("com.example.Missing", thrown.getMessage());
}
}
// Integration test: register ErrorThrowingDeserializer via module and
// verify it defers the error until actual deserialization
@SuppressWarnings("unchecked")
@Test
public void testViaModuleRegistration() throws Exception
{
NoClassDefFoundError error = new NoClassDefFoundError("some.missing.Class");
ErrorThrowingDeserializer deser = new ErrorThrowingDeserializer(error);
SimpleModule module = new SimpleModule("test");
// Need raw type cast since ErrorThrowingDeserializer extends ValueDeserializer<Object>
module.addDeserializer(MyValue.class,
(ValueDeserializer<MyValue>) (ValueDeserializer<?>) deser);
ObjectMapper mapper = newJsonMapper().rebuild()
.addModule(module)
.build();
NoClassDefFoundError thrown = assertThrows(NoClassDefFoundError.class,
() -> mapper.readValue("{\"x\":1}", MyValue.class));
assertSame(error, thrown);
}
}