如何在 groovy 测试用例中验证 java 数组列表的每个条目

How to validate each entry of arraylist of java in a groovy test case

我们正在使用 spock 框架(groovy 语言)为我们的 java 代码编写测试用例。

我是 groovy 和 spock 框架的新手。

我正在尝试验证哈希图中包含的值

我有一个 class 这样的:

public class Properties{

protected List<Pair> property;

public List<Pair> getProperty() {
        if (property == null) {
            property = new ArrayList<Pair>();
        }
        return this.property;
    }

}

public class Pair {

protected String name;
protected String surname;

...getters and setters

}

在spock框架中,测试用例如下:

def "Test case"(){

given:

....
....

when:
...
...

then:
...

def pairs = getProperties().getProperty()

pairs.each {

pair -> 
            if (pair.getName().equals("Anand")){
                pair.getSurname().equals("Zaveri")
                println "a"
            }
            if (pair.getName().equals("Rohit")){
                pair.getSurname().equals("Sharma")
            }

}
where:
...

}

现在当名字是 Rohit 时,列表包含姓氏是 Kapoor,我正在将它与 Sharma 进行比较,但测试用例仍然通过。

请告诉我我做错了什么。

列表包含很多名字,我想在这个测试用例中检查他们的姓氏。

为每个比较添加断言,例如

assert pair.getSurname().equals("Zaveri")

假设 类 在包 com.example 中,以下工作:

import com.example.*
import spock.lang.*

class PropertiesSpec extends Specification {

    def "test case"() {
        given:
            def properties = new Properties()
        when:
            properties.property.add(new Pair(name: 'Anand', surname: 'Zaveri'))
        then:
            1 == properties.property.size()
            // this is arguably not really testing new code:
            'Zaveri' == properties.property.find { it.name == 'Anand' }.surname
    }
}

then: 块中的第一个断言确认列表已创建。第二个断言确认添加了特定的 Pair,尽管可以说它并不是真正在测试新代码。 (这里"business logic"不多。)

Spock 检查 expect 块下的表达式结果。

val1 == val2 returns true 或 false,测试将成功或失败。

Each 不是 java 循环。它是returns集合中的一个方法。 因此,在您的示例中,Spock 仅检查 pairs.each{} returns 不是假的(groovy 中的空集合也是假的)。

如果您想检查每个列表元素,您可以更改代码以使用循环,或者您可以将集合放入 where 块中,例如:

void 'Test list of properties'() {

        expect:
        switch (pair.name) {
            case 'Anand': pair.surname == 'Zaveri'
                break
            case 'Rohit': pair.surname == 'Sharma'
                break
            default: true
        }
        where:
        pair << getProperties().getProperty()
    }