Java 使用assertEquals进行比较时,预期的相等JSON字符串不相等

Java 使用assertEquals进行比较时,预期的相等JSON字符串不相等,java,string,unit-testing,junit,equality,Java,String,Unit Testing,Junit,Equality,我为web服务客户端编写了JUnit测试,它向服务提交JSON文档 我将“正确”的JSON文档保存到该文件中,然后在测试执行后将其与实际结果进行比较 它们不匹配,尽管行是相同的: org.junit.ComparisonFailure: Expected :{"Callback":null,"Data": {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}} Actual :{"Callback":

我为web服务客户端编写了JUnit测试,它向服务提交JSON文档

我将“正确”的JSON文档保存到该文件中,然后在测试执行后将其与实际结果进行比较

它们不匹配,尽管行是相同的:

    org.junit.ComparisonFailure: 
    Expected :{"Callback":null,"Data":
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}}
    Actual   :{"Callback":null,"Data":
    {"MarketCode":"ISEM",,............"Price":2.99}]}]}]}]}}
行非常长,大约4K个字符,所以我在这里删掉了大部分,但它们的长度是相同的。我在调试器中比较了string.size(),并且在比较之前对其进行了修剪,以便最终删除一些不可见或空白符号,文本编辑器可以隐式插入这些符号

另外,当单独执行时,测试是正常的。但当我把它作为更大的套件的一部分运行时,它失败了

没有全局/静态变量,因此内存重写不应该是问题。 我模拟web服务客户端来提取请求字符串,如下所示:

StringBuilder pd = new StringBuilder();
doAnswer((invocation) -> {
  String postDocument = ((String)invocation.getArguments()[0]).trim();
  pd.append(postDocument);
  return null;
}).when(client).doPost(anyString(), anyObject());
客户端是模拟类

然后我比较了字符串的修剪版本,但没有帮助

String expectedSubmit = TestUtils.readXmlFromFile("strategyexecution\\ireland_bm_strategy_override_expected.json").trim();
assertEquals(expectedSubmit, pd.toString().trim());
我自己找到了答案:——) 问题在于JSON规范本身。 JSON不能保证数组中元素的顺序相同,它基本上是无序集。 因此,内容可以随机重新排序。生成的两个JSON文件不应作为两个字符串进行比较


我将其反序列化为Java对象,对象比较工作

与XML的老问题相同。对于XML,有一个在语义上比较XML-s的方法。对于JSON,我会尝试使用类似的工具,如。太有希望了。

这可能是编码问题吗?您可以尝试将这两个字符串写入单独的文件,并进行and md5或sha1校验和,以查看实际字节是否相同。请在Jenkins env上发布一个
assertEquals
is not brokenRuns fine。看起来像IntelliJ IDEA中的bug。它只有在IDEA中失败,并且只有在整个套件(不是一个类文件中的独立测试)执行时失败