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

如何单元测试从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 07:25:29