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

AssertJ递归比较集合时如何获取差异的详细路径?

获取AssertJ递归比较集合结构的详细差异路径

当使用AssertJ的usingRecursiveComparison()进行对象树比较时,集合结构默认错误信息仅展示上层路径,但通过以下方法可以获取深层详细差异路径:

1. 自定义差异格式化器

AssertJ允许自定义差异输出逻辑,实现ComparisonDifferenceFormatter接口,直接利用ComparisonDifference中存储的完整路径生成错误信息:

import org.assertj.core.api.recursive.comparison.ComparisonDifference;
import org.assertj.core.api.recursive.comparison.ComparisonDifferenceFormatter;

public class DetailedPathFormatter implements ComparisonDifferenceFormatter {
    @Override
    public String format(ComparisonDifference difference) {
        StringBuilder sb = new StringBuilder();
        sb.append(String.format("field/property '%s' differ:%n", difference.getPath()));
        sb.append(String.format("- actual value  : %s%n", difference.getActual()));
        sb.append(String.format("- expected value: %s", difference.getExpected()));
        if (!difference.getAdditionalInformation().isEmpty()) {
            sb.append(String.format("%n%s", difference.getAdditionalInformation()));
        }
        return sb.toString();
    }
}

在测试中应用该格式化器:

assertThat(first)
        .usingRecursiveComparison()
        .withDifferenceFormatter(new DetailedPathFormatter())
        .isEqualTo(second);

运行后错误信息会直接展示完整差异路径(如level2.level3)及详情。

2. 利用AssertJ新版本特性(3.20+)

AssertJ 3.20及以上版本优化了集合递归比较的差异输出,启用严格类型检查或调整匹配策略后,自动展示元素内部深层路径:

assertThat(first)
        .usingRecursiveComparison()
        .withStrictTypeChecking()
        .isEqualTo(second);

此方式无需自定义类,依赖框架自身改进即可获取详细路径。

核心原因

调试时发现的ComparisonDifference对象确实包含完整差异路径,但默认格式化器处理集合时会将整个集合作为单一差异点输出,未递归解析内部元素路径。上述两种方法可让深层路径被正确展示。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 13:45:21