用例断言整个响应 JSON 字符串相等,服务端只是把字段顺序调整了一下,用例红了一片,值其实一个都没改。乍看像缓存或者权限的锅,追下去往往不是。
JSONAssert.assertEquals(expected, actual, false);
assertThat(json.read('status')).isEqualTo('PAID');
追下去是这么回事:JSON 对象的键顺序本来就没有保证,直接比字符串等于把序列化实现细节写进了断言,换个库版本或改个字段声明顺序就失败,报错信息还很难看出差在哪。
「JSON 断言顺序」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。
先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
具体做法是,把响应反序列化成对象再逐字段断言;只比关键字段忽略无关项;要比整体结构时用非严格模式。
验收就看一点,字段顺序打乱后用例仍通过,字段值变化能明确报出是哪一个。
