如何对 Jackson JsonSerializer 和 JsonDeserializer 进行单元测试

2024-02-19

我为我的应用程序编写了自定义 JsonSerializer 和 JsonDeserializer 。 现在我想为它们编写一些单元测试。

一个干净的测试用例应该是什么样的?

有一些干净的例子吗?

(干净意味着不依赖其他框架或库)


Json序列化器

该示例正在序列化LocalDateTime但这可以替换为所需的类型。

@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\"")));
}

Json反序列化器

该示例正在反序列化Number但这可以替换为所需的类型。

    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);
    }

UPDATE

升级到 jackson 2.9.3 时,我收到了NullPointerException in DeserializationContext in isEnabled(MapperFeature feature)将字符串反序列化为数字时,因为new ObjectMapper()初始化_config to null.

为了解决这个问题,我使用了this https://stackoverflow.com/questions/14292863/how-to-mock-a-final-class-with-mockito/40018295#40018295所以答案来监视final class DeserializationContext:

DeserializationContext ctxt = spy(mapper.getDeserializationContext());
doReturn(true).when(ctxt).isEnabled(any(MapperFeature.class));

我觉得一定有更好的方法,如果有的话请评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何对 Jackson JsonSerializer 和 JsonDeserializer 进行单元测试 的相关文章

随机推荐