如何单元测试从Kafka获取JSON字符串映射到DTO的Mapper方法?
如何为Kafka消息映射方法编写单元测试
核心测试思路
这个方法的核心逻辑是将JSON字符串反序列化为LeadTimeDTO对象,单元测试需要覆盖两类核心场景:
- 合法JSON字符串能成功完成解析
- 非法JSON字符串会抛出指定的
IllegalArgumentException
依赖准备
确保测试类引入必要组件:JUnit 5(或JUnit 4)、Jackson的ObjectMapper,以及目标LeadTimeDTO类。
具体测试实现
1. 正常解析场景测试
构造符合LeadTimeDTO字段结构的合法JSON,验证方法执行无异常,且解析出的DTO字段值与JSON内容匹配。
import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class YourMapperClassTest { private final ObjectMapper objectMapper = new ObjectMapper(); private final YourMapperClass mapper = new YourMapperClass(); // 替换为你的实际类名 @Test void mapper_shouldParseValidJsonSuccessfully() { // 替换为LeadTimeDTO实际对应的JSON结构 String validJson = "{\"orderId\":\"ORD-001\",\"leadDays\":7,\"createTime\":\"2024-05-20\"}"; // 验证方法执行无异常 assertDoesNotThrow(() -> mapper.Mapper(validJson)); // 可选:单独验证DTO字段解析正确性 try { LeadTimeDTO dto = objectMapper.readValue(validJson, LeadTimeDTO.class); assertEquals("ORD-001", dto.getOrderId()); assertEquals(7, dto.getLeadDays()); } catch (Exception e) { fail("合法JSON解析失败"); } } }
2. 非法JSON场景测试
针对格式错误、字段类型不匹配、空字符串等非法输入,验证方法会抛出预期的IllegalArgumentException,且错误信息符合要求。
@Test void mapper_shouldThrowExceptionWhenJsonIsInvalid() { // 场景1:格式错误的JSON(缺失引号) String invalidFormatJson = "{orderId:\"ORD-001\"}"; IllegalArgumentException formatException = assertThrows(IllegalArgumentException.class, () -> mapper.Mapper(invalidFormatJson)); assertEquals("Error parsing to DTO", formatException.getMessage()); // 场景2:字段类型不匹配(leadDays应为数字却传字符串) String wrongTypeJson = "{\"orderId\":\"ORD-001\",\"leadDays\":\"seven\"}"; IllegalArgumentException typeException = assertThrows(IllegalArgumentException.class, () -> mapper.Mapper(wrongTypeJson)); assertEquals("Error parsing to DTO", typeException.getMessage()); // 场景3:空字符串输入 String emptyJson = ""; IllegalArgumentException emptyException = assertThrows(IllegalArgumentException.class, () -> mapper.Mapper(emptyJson)); assertEquals("Error parsing to DTO", emptyException.getMessage()); }
额外注意事项
- 如果
objectMapper是通过依赖注入注入到业务类中的,建议用Mockito模拟实例或注入配置好的真实实例,避免测试依赖外部环境。 - 不要依赖
System.out.println的输出作为验证逻辑,单元测试应聚焦于方法的行为结果(是否抛出异常、解析数据是否正确),而非控制台输出。
内容的提问来源于stack exchange,提问作者Jsef bch
相关产品推荐
相关产品推荐

