在Java中测试独立的自定义JsonDeserializer

在Java中测试独立的自定义JsonDeserializer,java,json,serialization,gson,Java,Json,Serialization,Gson,因此,对于我正在编写的这个小程序,我希望解析Twitter的推特流。我使用的是Gson库,它很好用。Gson无法解析在datetime字段创建的twitter,因此我必须编写一个自定义的JsonDserializer,需要通过GsonBuilder向解析器注册,如下所示: new GsonBuilder().registerTypeAdatapter(DateTime.class, <myCustomDeserializerType>) deserialize(JsonElemen

因此,对于我正在编写的这个小程序,我希望解析Twitter的推特流。我使用的是Gson库,它很好用。Gson无法解析在datetime字段创建的twitter,因此我必须编写一个自定义的
JsonDserializer
,需要通过
GsonBuilder
向解析器注册,如下所示:

new GsonBuilder().registerTypeAdatapter(DateTime.class, <myCustomDeserializerType>)
deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
假设我想解析以下数据:“Mon Mar 27 14:09:47+0000 2017”。为了正确测试反序列化程序,我必须如何转换输入数据


我不是在寻找真正解析这个日期的代码,我已经介绍了这一部分。我在问如何满足
反序列化
方法的签名,以便模拟它在
Gson
中的使用。
JsonSerializer
JsonSerializer
与Gson-JSON树模型和特定的
Gson
配置(de)紧密绑定序列化上下文,提供一组可以(反)序列化的类型。因此,完成
JsonSerializer
JsonDeserializer
的单元测试是相当困难而不是容易的

考虑一下
src/test/resources/../zoned date time.JSON中的以下JSON文档:

"Mon Mar 27 14:09:47 +0000 2017"
这是一个完全有效的JSON文档,为了简单起见,除了一个字符串之外,它什么都没有。上述格式的日期/时间格式化程序可以在Java 8中实现,如下所示:

new GsonBuilder().registerTypeAdatapter(DateTime.class, <myCustomDeserializerType>)
deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
final类定制模式{
私有定制模式(){
}
私有静态最终映射dayOfWeek=ImmutableMap.builder()
.put(1L,“周一”)
.put(2L,“星期二”)
.put(3L,“周三”)
.put(4L,“Thu”)
.put(5升,“周五”)
.put(6L,“Sat”)
.put(7L,“太阳”)
.build();
私有静态最终映射monthOfYear=ImmutableMap.builder()
.put(1L,“一月”)
.put(2L,“二月”)
.put(3L,“Mar”)
.put(4L,“Apr”)
.put(5L,“五月”)
.put(6L,“Jun”)
.put(7升,“7月”)
.put(8L,“八月”)
.put(9L,“九月”)
.put(10升,“10月”)
.put(11月11日)
.put(12升,“12月”)
.build();
静态最终DateTimeFormatter customDateTimeFormatter=new DateTimeFormatterBuilder()
.appendText(每周的第几天,每周的第几天)
.appendLiteral(“”)
.appendText(一年中的月,一年中的月)
.appendLiteral(“”)
.appendValue(每月的第天,第1天,第2天,非负)
.appendLiteral(“”)
.appendValue(每天的小时数,2)
.appendLiteral(“:”)
.appendValue(分钟/小时,2)
.appendLiteral(“:”)
.appendValue(每分钟第二次,2)
.appendLiteral(“”)
.appendOffset(“+HHMM”和“+0000”)
.appendLiteral(“”)
.附加价值(年)
.toFormatter();
}

现在考虑下面的JSON反序列化器,用于<代码> ZONDATDATEIME/<代码>:

final类ZonedDateTimeJsonDeserializer
实现JsonDeserializer{
私有静态最终JsonDeserializer zonedDateTimeJsonDeserializer=新的zonedDateTimeJsonDeserializer();
私有ZonedDateTimeJsonDeserializer(){
}
静态JsonDeserializer getZonedDateTimeJsonDeserializer(){
返回zonedDateTimeJsonDeserializer;
}
@凌驾
公共分区DateTime反序列化(最终JsonElement JsonElement、最终类型类型、最终JsonDeserializationContext上下文)
抛出JsonParseException{
试一试{
最后一个字符串s=context.deserialize(jsonElement,String.class);
返回ZonedDateTime.parse(s,customDateTimeFormatter);
}捕获(最终DateTimeParseException ex){
抛出新的JsonParseException(ex);
}
}
}
注意,我是通过上下文反序列化字符串的,目的是强调更复杂的
JsonDeserializer
实例可能严重依赖于它。现在让我们做一些JUnit测试来测试它:

公共最终类ZonedDateTimeJsonDeserializerTest{
私有静态最终类型令牌zonedDateTimeTypeToken=新类型令牌(){
};
私有静态最终ZonedDateTime expectedZonedDateTime=ZonedDateTime.of(2017年3月27日14月9日47日0日UTC);
@试验
public void test通过AutomaticTypeAdapterBinding()间接反序列化
抛出IOException{
最终JsonDeserializer单元=getZonedDateTimeJsonDeserializer();
最终Gson Gson=新的GsonBuilder()
.registerTypeAdapter(ZoneDateTime.class,单位)
.create();
try(final-JsonReader-JsonReader=getPackageResourceJsonReader(ZonedDateTimeJsonDeserializerTest.class,“zoned date time.json”)){
最终ZonedDateTime实际ZonedDateTime=gson.fromJson(jsonReader,ZonedDateTime.class);
资产(实际ZonedDateTime,为(预期ZonedDateTime));
}
}
@试验
public void test通过ManualTypeAdapterBinding()间接反序列化
抛出IOException{
最终JsonDeserializer单元=getZonedDateTimeJsonDeserializer();
最终Gson Gson=新Gson();
最终类型AdapterFactory类型AdapterFactory=newFactoryWithMatchRawType(zonedDateTimeTypeToken,单位);
final TypeAdapter dateTypeAdapter=typeAdapterFactory.create(gson,zonedDateTimeTypeToken);
try(final-JsonReader-JsonReader=getPackageResourceJsonReader(ZonedDateTimeJsonDeserializerTest.class,“zoned date time.json”)){
最终ZonedDateTime实际ZonedDateTime=dateTypeAdapter.read(jsonReader);
资产(实际ZonedDateTime,为(预期ZonedDateTime));
}
}
@试验
public void testDeserializeDirectlyWithMockedContext()
抛出IOException{
最终JsonDeserializer单元=getZonedDateTimeJsonDeserializer();
F