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
相关产品推荐
相关产品推荐

