You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot中Jackson YAML序列化的测试方案咨询

测试Spring Boot中Jackson YAML序列化的可行方案

1. 拆分测试场景,分而治之

把测试拆成两个独立部分,分别验证业务逻辑和序列化规则,避免耦合。

测试someMethod的业务逻辑

如果只需要验证someMethod中序列化之后的代码逻辑,可以用Mockito mock yamlMapper,跳过真实的序列化过程,专注于后续逻辑的正确性:

@ExtendWith(MockitoExtension.class)
class SomeServiceTest {
    @Mock
    private ObjectMapper yamlMapper;
    @InjectMocks
    private SomeService someService; // 假设someMethod属于SomeService类

    @Test
    void someMethod_shouldExecutePostSerializationLogic() throws JsonProcessingException {
        // 给定
        SomeClass testObj = new SomeClass();
        byte[] mockSerializedBytes = "mock-yaml-content".getBytes();
        when(yamlMapper.writeValueAsBytes(any(SomeClass.class))).thenReturn(mockSerializedBytes);

        // 执行
        someService.someMethod(testObj);

        // 验证
        verify(yamlMapper).writeValueAsBytes(testObj);
        // 这里添加后续业务逻辑的断言,比如验证某个方法被调用、状态被修改等
    }
}

验证YAML序列化的正确性(配置/字段顺序)

要确保自定义的Jackson配置(比如字段顺序保留、自定义序列化器、忽略字段等)生效,需要直接测试真实的序列化结果:

方式一:加载Spring上下文复用生产配置

通过加载定义yamlMapper的配置类,获取和生产环境完全一致的Bean,然后测试序列化:

@SpringBootTest(classes = {YamlMapperConfig.class}) // YamlMapperConfig是你的配置类
class YamlSerializationTest {
    @Autowired
    private ObjectMapper yamlMapper;

    @Test
    void serializeSomeClass_shouldMatchExpectedYaml() throws JsonProcessingException {
        // 给定
        SomeClass testObj = new SomeClass();
        testObj.setFirstName("Chanandler");
        testObj.setLastName("Bong");
        testObj.setAge(30);

        // 执行
        String serializedYaml = yamlMapper.writeValueAsString(testObj);

        // 断言:验证字段顺序和内容符合预期
        String expectedYaml = """
                firstName: Chanandler
                lastName: Bong
                age: 30
                """;
        assertEquals(expectedYaml, serializedYaml);
    }
}
方式二:手动实例化yamlMapper(快速测试)

如果配置类中的yamlMapper创建逻辑清晰,可以直接在测试中复制该逻辑,避免启动Spring上下文,提升测试速度:

class YamlSerializationFastTest {
    private ObjectMapper yamlMapper;

    @BeforeEach
    void setUp() {
        // 完全复制生产环境的yamlMapper配置
        yamlMapper = new ObjectMapper(new YAMLFactory())
                .configure(SerializationFeature.INDENT_OUTPUT, true)
                .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, false) // 保留字段顺序
                .registerModule(new JavaTimeModule()); // 比如注册时间模块
    }

    @Test
    void serializeSomeClass_shouldPreserveFieldOrder() throws JsonProcessingException {
        SomeClass testObj = new SomeClass("Chanandler", "Bong", 30);
        String serializedYaml = yamlMapper.writeValueAsString(testObj);
        
        // 验证字段顺序和类定义一致,而非字母排序
        assertThat(serializedYaml).containsSubsequence("firstName:", "lastName:", "age:");
    }
}

2. 进阶:用AssertJ简化YAML断言

如果YAML结构复杂,手动对比字符串容易出错,可以使用AssertJ的YAML断言功能,它会忽略格式细节(比如换行、空格),只验证结构和值的一致性:

@Test
void serializeSomeClass_shouldMatchExpectedYamlStructure() throws JsonProcessingException {
    String serializedYaml = yamlMapper.writeValueAsString(testObj);
    String expectedYaml = """
            firstName: Chanandler
            lastName: Bong
            age: 30
            """;
    assertThat(serializedYaml).isEqualToYaml(expectedYaml);
}

内容的提问来源于stack exchange,提问作者Chanandler Bong

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 23:01:31