我有一個類,配置傑克遜ObjectMapper。它增加了一些自定義的串行器和解串器對我的對象類型如下:傑克遜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,}序列化器的模擬,甚至測試它們序列化到你期望的。 – fge
在您的示例中,com.fasterxml.jackson.databind.type.SimpleType.construct()方法似乎執行與已棄用的TypeFactory.type()相同的功能。 –
事件更好,ObjectMapper.getTypeFactory()返回一個帶有大量工廠「constructSomeType」方法的TypeFactory實例。但是這些類和方法來自傑克遜2.3,所以我假設你仍然使用1.9分支。 –