2026最新java单元测试json校验器

简介:

这是一个功能强大的 JSON 校验工具库,提供了灵活的 JSON 比较和自定义校验功能。

在java的单元测试中,可以轻松地使用这个工具库进行 JSON 数据的校验,并在测试失败时,会显示详细的差异信息,帮助开发人员快速定位问题。

核心功能:

  • **基础类型校验**: 支持字符串、数字、布尔值、数组、对象等基础数据类型比较

  • **嵌套结构校验**: 支持多层嵌套 JSON 结构的深度比较

  • **自定义校验器**: 提供扩展接口,支持自定义校验逻辑

1. 基础校验

  • **数值比较**: 支持整数、浮点数比较

  • **字符串比较**: 严格字符串匹配

  • **布尔值比较**: 真假值校验

  • **数组校验**: 按顺序比较数组元素及长度

  • **对象校验**: 递归比较对象属性

2. 自定义校验器

  • **[IgnoreCheck]**: 忽略指定字段的校验

  • **[TimeCheckNow]**: 时间字段与当前时间比较

  • **[RegexCheck]**: 正则表达式校验

  • **[TimeCheck]**: 多格式时间校验

3. 使用示例

该包发布于github,maven引入:

复制代码
<dependency>
  <groupId>github.ccg</groupId>
  <artifactId>ccg-test</artifactId>
  <version>1.0.0</version>
</dependency>

项目地址:https://github.com/5499ccg/ccg-test

基础校验

```java

JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述");

```

带自定义校验器

```java

Check ignoreId = Check.ignore("datas.id");

JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", ignoreId);

```

时间校验

```java

Check timeNow = Check.timeNow("createTime");

JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", timeNow);

```

正则校验

```java

Check regexCheck = Check.regex("^\\d{4}$", "id");

JsonAssert.assertJsonEquals(expectedJson, actualJson, "校验描述", regexCheck);

```

错误处理:

  • **详细错误信息**: 提供清晰的差异对比信息

  • **路径定位**: 显示差异字段的完整路径

  • **格式化输出**: 自动格式化 JSON 输出便于查看

测试覆盖

  • **单层校验**: 基础数据类型比较

  • **多层校验**: 嵌套结构比较

  • **边界情况**: null 值、缺失字段处理

  • **自定义校验**: 各种校验器功能测试

优势

  1. **灵活性**: 支持自定义校验器扩展

  2. **准确性**: 深度比较,精确定位差异

  3. **易用性**: 简洁的 API 设计

  4. **可维护性**: 清晰的架构设计

适用场景

  • API 响应数据校验

  • JSON 数据一致性检查

  • 单元测试中的数据验证

  • 数据迁移校验

如果你有任何问题或者新的功能需求,欢迎提issue,或加好友讨论:549958058。

复制代码
    @DataProvider(name = "data_jsonCompare_checkImpl")
    public Object[][] data_jsonCompare_checkImpl() {
        return new Object[][]{
                {"1.json两层,id存在差异,忽略校验", "1_json_2floor_diff_and_ignore", true},
                {"2.json两层,实际数据的id不存在,忽略校验", "2_json_2floor_actual_isNull_and_ignore", true},
                {"3.json两层,期望的数据的id不存在,忽略校验", "3_json_2floor_expect_isNull_and_ignore", true},
                {"4.json两层,id差异忽略校验,期望数据与当前时间比较", "4_json_2floor_idIgnore_time_compareToNow", true},
                {"5.json两层,id差异,使用正则表达式校验,校验通过", "5_json_2floor_id_regexCheck_pass", true},
                {"6.json两层,id差异,使用正则表达式校验,校验不通过", "6_json_2floor_id_regexCheck_error", false},
                {"7.json两层,id和joinDate差异,一起忽略", "7_json_2floor_id_and_joinDate_ignore", true},
        };
    }

    @Test(dataProvider = "data_jsonCompare_checkImpl")
    public void test_jsonCompare_checkImpl(String comment, String testNo, boolean pass) throws Exception {
        logger.info("test_jsonCompare_checkImpl test start: {}, {}.", comment, testNo);
        Map<String, String> params = new HashMap<>();
        params.put("nowDate", DateParseUtil.formatDateToStandard(new Date()));
        // 1.获取需要校验的json
        String expectedJson = FileTools.readAsStringByPathAndStack(testNo + "/expectData.json");
        String actualJson = FileTools.readAsStringByPathAndStack(testNo + "/actualData.json", params);
        List<Check> checks = new ArrayList<>();
        // 2.设置字段自定义校验器,这里忽略id
        checks.add(testNo.contains("id_and_joinDate_ignore") ? Check.ignore("datas.id", "datas.joinDate") : Check.ignore("datas.id"));
        if (testNo.contains("compareToNow")) {
            checks.add(Check.timeNow("datas.joinDate"));
        }
        // 这里是正则表达式
        if (testNo.contains("regexCheck")) {
            if (pass) {
                checks.add(Check.regex("^\\d{4}$", "datas.id"));
            } else {
                checks.add(Check.regex("^\\d{5}$", "datas.id"));
            }
        }
        try {
            // 开始校验
            JsonAssert.assertJsonEquals(expectedJson, actualJson, comment, checks.toArray(new Check[0]));
            if (!pass) {
                Assert.fail(comment);
            }
        } catch (AssertionError e) {
            if (!pass) {
                String message = e.getMessage();
                logger.error(e);
                String expectMessage = FileTools.readAsStringByPathAndStack(testNo + "/diff_error.txt");
                Assert.assertEquals(message, expectMessage, comment);
//            throw e;
            }
        }
    }
相关推荐
菜鸟的迷茫2 小时前
为了防雪崩加了限流,结果入口先挂了
java·后端·架构
荒诞硬汉2 小时前
数组常见算法
java·数据结构·算法
悟空码字2 小时前
SpringBoot整合MongoDB,性能提升,优化实践
java·spring boot·后端
1***35772 小时前
spring loC&DI 详解
java·spring·rpc
独自破碎E2 小时前
介绍一下Spring AI框架
java·人工智能·spring
黎雁·泠崖2 小时前
Java入门篇之吃透基础语法(一):注释+关键字+字面量全解析
java·开发语言·intellij-idea·intellij idea
mjhcsp2 小时前
C++ 后缀树(Suffix Tree):原理、实现与应用全解析
java·开发语言·c++·suffix-tree·后缀树
sin22012 小时前
Spring事务管理(SpringBoot)
java·spring boot·spring
C***11502 小时前
Spring TransactionTemplate 深入解析与高级用法
java·数据库·spring