org.junit.ComparisonFailure报错:JSON字段取值断言出现多余方括号
问题根因
报错堆栈里看到的双层方括号是JUnit断言失败提示的格式标记(外层方括号用于标识差异内容边界),实际返回的字符串值是单层方括号包裹的[100.0]。
问题出在JsonPath路径写法错误:你的JSON结构里accumDetailsMapList下的MOD字段是数组类型(值被[]包裹,当前数组内仅有1个元素),你写的JsonPath路径没有指定数组下标,直接跨数组读取子字段individAmt时,JsonPath会自动把所有匹配到的字段值收集为列表返回,调用getString()拿到的是列表的字符串序列化结果[100.0],和你预期的纯值字符串100.0不匹配,因此触发断言失败。
修复方法
你可以任选以下一种方式修改代码:
- 方式1:在JsonPath中明确指定数组下标,直接读取目标元素的字段值(最简便)
将取值行修改为:
其中String accumlStatement1 = S1Response.jsonPath().getString("accumDetailsMapList.MOD[0].individAmt");[0]代表取MOD数组的第一个元素,路径匹配到的是单个对象的字段,不会再返回列表结构。 - 方式2:按列表类型读取结果后再取元素断言(适合数组长度不固定的场景)
代码示例:// 注意individAmt是数值类型,直接按Double读取比转字符串更可靠,避免格式差异 List<Double> individAmtList = S1Response.jsonPath().getList("accumDetailsMapList.MOD.individAmt", Double.class); Assert.assertEquals(Double.valueOf(100.0), individAmtList.get(0));
额外提示:不建议把数值类型的响应字段转成字符串做断言,否则可能因为小数位保留差异(比如返回
100.00、100)触发非预期的断言失败,直接匹配数值类型更稳妥。
内容的提问来源于stack exchange,提问作者Muazzam
相关产品推荐
相关产品推荐

