【发布时间】:2014-02-11 15:45:32
【问题描述】:
我有一个配置 Jackson ObjectMapper 的类。它为我的对象类型添加了一些自定义序列化器和反序列化器,如下所示:
public class JsonMapperFactory {
public static ObjectMapper createObjectMapper() {
final SimpleModule module = new SimpleModule("customerSerializationModule", new Version(1, 0, 0, "static version"));
addCustomDeserializersTo(module);
addCustomSerializersTo(module);
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(module);
return objectMapper;
}
private static void addCustomSerializersTo(final SimpleModule module) {
module.addSerializer(DateTime.class, new DateTimeSerializer());
}
private static void addCustomDeserializersTo(final SimpleModule objectMapper) {
objectMapper.addDeserializer(DateTime.class, new DateTimeDeserializer());
}
}
我已经在他们自己的测试类中测试了我的客户序列化器,所以在我对这个 JsonMapperFactory 类的测试中,我试图简单地检查创建的 ObjectMapper 是否具有预期的序列化器(或反序列化器)这可以实现通过自省 ObjectMapper,但它似乎没有任何机制可以做到这一点。
有谁知道测试的好方法吗?
对于反序列化器,我有以下内容:
private void assertThatObjectMapperUsesCorrectDeserializer(final Class<?> typeClazz, final Class<?> deserializerClazz) throws JsonMappingException {
final DeserializationConfig deserializationConfig = this.objectMapper.getDeserializationConfig();
final JsonDeserializer<Object> deserializer = this.objectMapper.getDeserializerProvider().findTypedValueDeserializer(deserializationConfig, javaTypeFor(typeClazz), null);
assertThat(deserializer, is(instanceOf(deserializerClazz)));
}
private JavaType javaTypeFor(final Class<?> clazz) {
return TypeFactory.type(clazz); //deprecated method :(
}
这非常冗长并且使用了不推荐使用的方法。
我还没有找到对序列化程序进行类似测试的方法。所以我目前采用序列化一个对象并检查它是否正确序列化(本质上是重复序列化程序测试)
非常欢迎任何想法。
【问题讨论】:
-
如果你的类使用了构建器,那测试起来会容易得多;通过这种方式,您可以传递 {de,} 序列化程序的模拟,甚至测试它们是否按照您的期望进行序列化。
-
com.fasterxml.jackson.databind.type.SimpleType.construct() 方法似乎执行与您示例中已弃用的 TypeFactory.type() 相同的功能。
-
事件更好,ObjectMapper.getTypeFactory() 返回一个带有很多工厂“constructSomeType”方法的 TypeFactory 实例。但是这些类和方法来自jackson 2.3,所以我假设你还在使用1.9分支。
-
@OlegEstekhin 实际上我发现前几天。我不得不遍历并更新项目中的所有依赖项,并找到了新的类型工厂实例方法。
标签: java testing serialization jackson deserialization