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

