2017-09-14 78 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也看起來很有希望。

相關問題