2015-10-14 40 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

相关问题