【问题标题】:How to compare similar field names in different type of objects in collections in Spock?如何比较Spock集合中不同类型对象中的相似字段名称?
【发布时间】:2018-07-29 21:05:22
【问题描述】:

我有两个不同类型的集合 - 例如。 FruitVegetable

现在在 spock 中,我通过以下方式之一断言这些集合的内容:

fruits.size() == vegetables.size()
for (int i = 0; i < fruits.size(); i++) {
    assert fruits[i].name == vegetables[i].name
    assert fruits[i].active == vegetables[i].enabled
}

有没有更好的方法来比较这些集合?

【问题讨论】:

    标签: groovy spock assertions


    【解决方案1】:

    您可以利用Groovy's spread operator 提取值列表并比较这些列表。考虑以下示例:

    class Fruit {
        String name
        boolean active
    }
    
    class Vegetable {
        String name
        boolean enabled
    }
    
    def fruits = [new Fruit(name: 'Apple', active: false), new Fruit(name: 'Tomato', active: true)]
    def vegetables = [new Vegetable(name: 'Apple', enabled: false), new Vegetable(name: 'Tomato', enabled: false)]
    
    assert fruits.name == vegetables.name
    assert fruits.active == vegetables.enabled
    

    第一个断言通过,因为:

    assert ['Apple', 'Tomato'] == ['Apple', 'Tomato']
    

    但是第二个断言失败了,因为:

    assert fruits.active == vegetables.enabled
           |      |      |  |          |
           |      |      |  |          [false, false]
           |      |      |  [Vegetable@5b8dfcc1, Vegetable@2f9f7dcf]
           |      |      false
           |      [false, true]
           [Fruit@747ddf94, Fruit@35e2d654]
    

    在这种情况下,您不必比较两个列表是否具有相同的大小并且对象的顺序也很重要。唯一的缺点是您提取到列表的值必须具有可比性 - 否则它将比较对对象的引用。

    最后,您的 Spock 测试可能如下所示:

    def "comparing fruits and vegetales"() {
        when:
        def fruits = initializeFruits()
        def vegetables = initializeVegetables()
    
        then:
        fruits.name == vegetables.names
    
        and:
        fruits.active == vegetables.enabled
    }
    

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-28
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多