当前位置: 首页 > 知识库问答 >
问题:

如何对自定义Jackson JsonSerializer进行单元测试?

郑和泰
2023-03-14

我编写了以下jsonSerializer来让Jackson将一个数组的整数序列化为JSON:

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;

public class TalkIdsSerializer extends JsonSerializer<TalkIds> {

    /**
     * Serializes a TalkIds object into the following JSON string:
     * Example: { "talk_ids" : [ 5931, 5930 ] }
     */
    @Override
    public void serialize(TalkIds talkIds, JsonGenerator jsonGenerator, 
        SerializerProvider provider)
            throws IOException {
        jsonGenerator.writeStartObject();
        jsonGenerator.writeArrayFieldStart(TalkIds.API_DICTIONARY_KEY);
        for (Integer talkId : talkIds.getTalkIds()) {
            jsonGenerator.writeNumber(talkId);
        }
        jsonGenerator.writeEndArray();
        jsonGenerator.writeEndObject();
    }

}

此处使用该类:

@JsonSerialize(using = TalkIdsSerializer.class)
public class TalkIds { /* ...  */ }

我想测试序列化程序的行为,并得出以下结论:

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import org.junit.Before;
import org.junit.Test;    
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Arrays;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

public class TalkIdsSerializerTest {

    protected final ArrayList<Integer> TALK_IDS = 
        new ArrayList<>(Arrays.asList(5931, 5930));

    protected TalkIdsSerializer talkIdsSerializer;

    @Before
    public void setup() throws IOException {
        talkIdsSerializer = new TalkIdsSerializer();
    }

    @Test
    public void testSerialize() throws IOException {
        StringWriter stringWriter = new StringWriter();
        JsonGenerator jsonGenerator = 
            new JsonFactory().createGenerator(stringWriter);
        TalkIds talkIds = new TalkIds();
        talkIds.add(TALK_IDS);
        talkIdsSerializer.serialize(talkIds, jsonGenerator, null);
        String string = stringWriter.toString(); // string is ""
        assertNotNull(string);
        assertTrue(string.length() > 0);
        stringWriter.close();
    }

}

但是,不向StringWriter写入任何内容。我做错了什么?

共有1个答案

尉迟龙光
2023-03-14

您需要flush()生成器

方法调用以将所有缓冲内容刷新到基础目标(输出流、写入器),并刷新目标本身。
http://fasterxml.github.io/jackson-core/javadoc/2.1.0/com/fasterxml/jackson/core/jsongenerator.html#flush()

 类似资料:
  • 问题内容: 我已经开发了一种map-reduce程序。我写了习俗和课程。 我正在使用mapper和reducer 并对其进行单元测试。 我想知道如何对定制和类进行单元测试?测试这些类的最优选方法是什么? 问题答案: 答案中示例代码的经过编译和某种程度上的测

  • 问题内容: 如何在单元测试中测试 hashCode()函数? 问题答案: 每当我覆盖equals和hash代码时,我都会按照Joshua Bloch在“ Effective Java”第3章中的建议编写单元测试。我确保equals和hash代码是自反的,对称的和可传递的。我还确保“不等于”对所有数据成员均正常工作。 当我检查对equals的调用时,我还要确保hashCode的行为符合预期。像这样:

  • 我已经创建了一个自定义弹性搜索客户端。我需要在各种功能上部署单元测试。我该怎么做呢? 下面是我的客户提供的一个方法。我应该如何在这里部署单元测试? 我该如何着手做这件事呢?

  • 问题内容: 我已Spring Boot启用基本身份验证的应用程序。从数据库消耗。为了进行单元测试,我想对其进行模拟,以便从其他地方使用数据。 我该怎么做? 我的问题不是如何模拟自身,而是如何模拟使用它来通过基本身份验证测试Controller的方式。 以下是我的SpringSecurity配置: 总之,我怎么能嘲笑UserServiceDetails到SpringSecurity配置,所以我能单元

  • 问题内容: 我一直在学习AngularJS,并且在单元测试方面进展非常顺利,但是我遇到了一个棘手的问题。 假设我有一个简单的表格,例如: 如果我正在测试类似控制器的东西,我知道我会这样写(使用Jasmine + Karma): 但是我不知道我需要注入哪些服务,也没有运气在指南或文档中找到有关单元测试的文档。 一个单元如何在Angular中测试表单? 问题答案: 我不认为这是对此类内容进行单元测试的

  • 本文向大家介绍对Angular.js Controller如何进行单元测试,包括了对Angular.js Controller如何进行单元测试的使用技巧和注意事项,需要的朋友参考一下 一、写个简单的Angular App 在开始写测试之前,我们先写一个简单的计算App,它会计算两个数字之和。 代码如下: 二、简单说说里面涉及的一些基本概念: 创建一个 module 什么是angular.modul