2015-10-14 11 views
1

我照例上產生地圖作爲輸出代碼工作。隨着代碼的變化,我必須確保代碼變化產生相同的地圖輸出作爲舊代碼。所以我所做的是我連載所需的輸出映射到JSON文件,現在寫的JUnit測試案例我跑,看看是否通過新代碼創建的映射與從JSON deserialised地圖匹配。然而,當它不匹配就變得很難準確地指出,在這關鍵之眼福。例如,請考慮下面的代碼:知道哪裏地圖在它們的內容的不同之處常規

def nestedmapeq1 = ["key1":"val1","key2":"val2", "key3": ["k1":"v1","k2":["v2"]]] 
    def nestedmapeq2 = ["key1":"val1","key2":"val2", "key3": ["k1":"v1","k2":["v2","v3"]]] 
    assert nestedmapeq1.equals(nestedmapeq2) 

輸出這裏如下:

enter image description here

正如你可以看到不同的是,關鍵k2嵌套列表在nestedmapeq2而兩個元素``nestedmapeq``中只有一個元素

在這種情況下,查看嵌套鍵/列表具有不同內容的輸出很簡單。但是,當輸出是非常大的,比如說含200+地圖列表,或者說圖的200多個鍵,就幾乎不可能從那裏不同之處在於輸出來推斷。

我可以寫一個遞歸泛型函數做相同的,只是想知道,如果這樣美妙的事情已經存在,可以明確地指出了列表索引和地圖鍵,其內容是不同的。如果它需要兩個對象作爲參數,既可以是列表也可以是映射,並檢查它們的內容是否相同,即使這樣的泛型函數的Java實現也可以完成這項工作。 )

+0

我不相信這樣的事情已經存在... –

+0

'assert'用'.equals'上'Map'做檢查內容是否相同。對?缺少的僅僅是能夠明確說明內容不同的特徵? – Mahesha999

回答

1

如果你可以將你的斷言代碼作爲一個單元測試來實現,那麼請嘗試使用Spock Framework。

import spock.lang.Specification 

class Foo extends Specification { 

    def 'compares two maps'() { 
     given: 
     def nestedMapEq1 = ['key1': 'val1', 'key2': 'val2', 'key3': ['k1': 'v1', 'k2': ['v2']]] 
     def nestedMapEq2 = ['key1': 'val1', 'key2': 'val2', 'key3': ['k1': 'v1', 'k2': ['v2', 'v3']]] 

     expect: 
     nestedMapEq1 == nestedMapEq2 
    } 
} 

執行這樣的測試結果:

Condition not satisfied: 

nestedMapEq1 == nestedMapEq2 
|   | | 
|   | [key1:val1, key2:val2, key3:[k1:v1, k2:[v2, v3]]] 
|   false 
[key1:val1, key2:val2, key3:[k1:v1, k2:[v2]]] 
<Click to see difference> 

     at Foo.compares two maps(Foo.groovy:12) 

就其本身而言,可能沒有足夠的幫助。當你點擊查看差異(IntelliJ IDEA的),雖然它變得更好:

the difference dialog window

相關問題