gpt4 book ai didi

java - 了解 groovy 中 map 内容的不同之处

转载 作者:行者123 更新时间:2023-11-30 07:52:52 24 4
gpt4 key购买 nike

我经常编写生成 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)

这里的输出如下:

enter image description here

正如您所看到的,区别在于带有键 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)时,它会变得更好:

the difference dialog window

关于java - 了解 groovy 中 map 内容的不同之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33122243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com