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

标签 java groovy maps

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

相关文章:

java - BorderLayout - 两个组件中只有一个出现在 SOUTH 中

gradle - 为什么 Gradle 不会将运行时参数传递给 Groovy?

java - elasticsearch 无法启动,因为它找不到 java 8

java - HttpExchange GET 到达为空

java - 如何处理时区来计算滞后

java - 在 Groovy 中将整数转换为 boolean 数组

java - Grails - 从 groovy 中的默认 json 转换器中排除类名的更好方法?

java - 你能推荐一个用于商业用途的 map API 吗?

android - Overlay.draw() 多次调用

google-maps - 历史谷歌静态 map 图像