2017-09-14 61 views
1

时,预期的相等JSON字符串不相等我为Web服务客户端编写了JUnit测试,该测试向服务提交JSON文档。当使用assertEquals

我将“正确”的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()); 
+0

它可能是一个编码问题?您可以尝试写入两个字符串来分隔文件,并采用md5或sha1校验和来查看实际字节是否相同。 – inovaovao

+4

请发表[mcve]'assertEquals'不坏 – 2017-09-14 11:25:10

+0

在Jenkins env上运行良好。看起来像IntelliJ IDEA中的错误。它仅在IDEA中失效,并且仅在整个套件(不是在一个类文件中进行隔离测试)执行时才会失败 –

回答

1

我发现自己回答:-) 的问题是使用JSON规范本身。 JSON不能保证数组内部元素的顺序相同,它基本上是无序集合。 因此,内容可以随机重新排序。两个生成的JSON文件不应该作为两个字符串进行比较。

我将它反序列化为Java对象和对象比较工作!

0

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

相关问题