断言两个列表在 Spock 框架中相等

2022-09-02 23:45:15

我使用Spock框架测试我的应用程序,测试是用Groovy编写的。

作为一些方法评估的结果,我有一个对象列表。我想测试此列表是否与我期望的列表相同。我编写了以下内容:

def expectedResults = [ ... ] //the list I expect to see
def isEqual = true;

when:
def realResults = getRealResultsMethod() //get real results in a list here
expectedResults.each {isEqual &= realResults.contains(it)}
then:
isEqual
0 * errorHandler.handleError(_) //by the way assert that my errorHandler is never called

这是我第一次与Groovy的经历之一,所以可能是我错过了什么?

附言

让我感到困惑的是Groovy和Spock中的“equals”运算符。给定 Java ArrayList 或 Java 数组,equals 运算符只是标识运算符:equals 是 ==。据我所知,在Groovy中,默认等于运算符实际上是相等的(此处的形式:http://groovy.codehaus.org/Differences+from+Java)。但是,对于Groovy List或Set来说,什么是“equals”呢?

更新

更确切地说。我想找出两个列表是否具有相同的对象,两个列表没有额外的对象,顺序无关紧要。例如:

list=[1,5,8]

list1=[5,1,8]    
list2=[1,5,8,9]

println(list == list1) //should be equal, if we use == not equal    
println(list == list2) //should not be equal, if we use == not equal

答案 1

只需做:

when:
    def expectedResults = [ ... ]
    def realResults = getRealResultsMethod()

then:
    realResults == expectedResults

或者,如果你不关心顺序(这违反了List的合同,但你去了),你可以这样做:

then:
    realResults.sort() == expectedResults.sort()

或者将它们转换为集合或其他内容


答案 2

如果您只需要检查两个列表是否具有相同的元素,您可以尝试:

when:
    def expectedResults = [ ... ]
    def realResults = getRealResultsMethod()

then:
    realResults.size() == expectedResults.size()
    realResults.containsAll(expectedResults)
    expectedResults.containsAll(realResults)

但是,如果您需要检查两个列表是否相等,您只需要(如@tim_yates的响应中所示):

when:
    def expectedResults = [ ... ]
    def realResults = getRealResultsMethod()

then:
    realResults == expectedResults

请记住,仅当两个列表具有相同的元素并按相同顺序排列时,它们才相等。


推荐