如何对Jackson JsonSerializer和JsonDeserializer进行单元测试 [英] How to unit-test Jackson JsonSerializer and JsonDeserializer
问题描述
我为我的应用程序编写了自定义JsonSerializer和JsonDeserializer.现在,我要为它们编写一些单元测试.
I've written custom JsonSerializer and JsonDeserializer for my app. Now I want to write some unit-tests for them.
干净的测试用例应该是什么样子?
How should a clean test case look like?
那里有一些干净的例子吗?
Are there some clean examples out there?
(干净意味着不依赖于其他框架或库)
(clean means no dependencies to other frameworks or libraries)
推荐答案
JsonSerializer
该示例正在对 LocalDateTime
进行序列化,但是可以将其替换为所需的类型.
The example is serialising a LocalDateTime
but this can replaced by the required type.
@Test
public void serialises_LocalDateTime() throws JsonProcessingException, IOException {
Writer jsonWriter = new StringWriter();
JsonGenerator jsonGenerator = new JsonFactory().createGenerator(jsonWriter);
SerializerProvider serializerProvider = new ObjectMapper().getSerializerProvider();
new LocalDateTimeJsonSerializer().serialize(LocalDateTime.of(2000, Month.JANUARY, 1, 0, 0), jsonGenerator, serializerProvider);
jsonGenerator.flush();
assertThat(jsonWriter.toString(), is(equalTo("\"2000-01-01T00:00:00\"")));
}
JsonDeserializer
该示例正在反序列化 Number
,但是可以将其替换为所需的类型.
The example is deserialising a Number
but this can replaced by the required type.
private ObjectMapper mapper;
private CustomerNumberDeserialiser deserializer;
@Before
public void setup() {
mapper = new ObjectMapper();
deserializer = new CustomerNumberDeserialiser();
}
@Test
public void floating_point_string_deserialises_to_Double_value() {
String json = String.format("{\"value\":%s}", "\"1.1\"");
Number deserialisedNumber = deserialiseNumber(json);
assertThat(deserialisedNumber, instanceOf(Double.class));
assertThat(deserialisedNumber, is(equalTo(1.1d)));
}
@SneakyThrows({JsonParseException.class, IOException.class})
private Number deserialiseNumber(String json) {
InputStream stream = new ByteArrayInputStream(json.getBytes(StandardCharsets.UTF_8));
JsonParser parser = mapper.getFactory().createParser(stream);
DeserializationContext ctxt = mapper.getDeserializationContext();
parser.nextToken();
parser.nextToken();
parser.nextToken();
return deserializer.deserialize(parser, ctxt);
}
更新
升级到杰克逊2.9.3时,在将字符串反序列化为数字时,在 isEnabled(MapperFeature功能)
的 DeserializationContext
中收到了 NullPointerException
,因为 new ObjectMapper()
将 _config
初始化为 null
.
When upgrading to jackson 2.9.3 I received a NullPointerException
in DeserializationContext
in isEnabled(MapperFeature feature)
when deserialising strings to numbers because new ObjectMapper()
initialises _config
to null
.
要解决此问题,我使用了 this 对 final
类 DeserializationContext
进行间谍的答案:
To get around this, I used this SO answer to spy on the final
class DeserializationContext
:
DeserializationContext ctxt = spy(mapper.getDeserializationContext());
doReturn(true).when(ctxt).isEnabled(any(MapperFeature.class));
我觉得必须有更好的方法,所以如果有的话请发表评论.
I feel there must be a better way, so please comment if you have one.
这篇关于如何对Jackson JsonSerializer和JsonDeserializer进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!