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

时间:2017-09-14 11:13:10

标签: java string unit-testing junit equality

我为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());

2 个答案:

答案 0 :(得分:1)

我找到了答案:-) 问题在于JSON规范本身。 JSON不能保证数组内元素的顺序相同,它基本上是无序集合。 因此,内容可以随机重新排序。不应将两个生成的JSON文件作为两个字符串进行比较。

我将它反序列化为Java对象并且对象比较有效!

答案 1 :(得分:1)

与XML相同的旧问题。对于XML,有XMLUnit 语义比较xml-s。对于JSON,我尝试使用类似的工具,如JsoNunitJSONAssert看起来很有希望。