我经常处理生成地图作为输出的代码。随着代码的变化,我必须确保代码更改产生与旧代码相同的映射输出。所以我所做的是将所需的输出映射序列化为json文件,现在编写了junit测试用例,我运行这些测试用例来查看新代码创建的映射是否与从json反序列化的映射匹配。但是当它无法匹配时,很难准确地指出它无法匹配的键。例如,请考虑以下代码:
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)
此处的输出如下:
正如您所看到的不同之处在于,带有键k2
的嵌套列表在nestedmapeq2
中有两个元素,而``nestedmapeq``中只有一个元素
在这种情况下,简单地查看嵌套键/列表具有不同内容的输出。但是当输出非常大时,比如包含200多张地图的列表或者说200多个关键字的地图,实际上不可能从输出中推断出差异所在。
我可以写一个递归泛型函数来做同样的事情,但只是想知道是否已经存在这样一个可以明确指出其内容不同的列表索引或映射键的东西。
(即使是这种通用函数的Java实现也会完成这项工作,如果它需要两个对象作为参数,可以是列表或映射,并检查它们的内容是否相同。如果没有,那么请特别指出它不同的地方。)
答案 0 :(得分: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)时会变得更好: