我经常编写生成 map 作为输出的代码。当代码更改时,我必须确保代码更改产生与旧代码相同的 map 输出。所以我所做的是将所需的输出映射序列化为 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 实现也可以完成这项工作,如果它以两个对象作为参数(可以是列表或映射)并检查它们的内容是否相同。如果不同则具体指出不同之处。)
最佳答案
如果您可以将断言代码实现为单元测试,请尝试使用 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)时,它会变得更好:
关于java - 了解 groovy 中 map 内容的不同之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33122243/