如何对Jackson JsonSerializer和JsonDeserializer进行单元测试 [英] How to unit-test Jackson JsonSerializer and JsonDeserializer

查看:90
本文介绍了如何对Jackson JsonSerializer和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆