断言两个列表在Spock框架中是相同的

Mia*_*ach 10 java groovy spock

我使用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
Run Code Online (Sandbox Code Playgroud)

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

PS

令我困惑的是Groovy和Spock中的'equals'运算符.给定Java ArrayList或Java数组,equals运算符只是标识运算符:equals is ==.在Groovy中,据我所知,默认等于运算符实际上是等于(在此处形成:http://groovy.codehaus.org/Differences+from+Java).但是Groovy List或Set的'等于'是什么?

UPDATE

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

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
Run Code Online (Sandbox Code Playgroud)

tim*_*tes 18

做就是了:

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

then:
    realResults == expectedResults
Run Code Online (Sandbox Code Playgroud)

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

then:
    realResults.sort() == expectedResults.sort()
Run Code Online (Sandbox Code Playgroud)

或者将它们转换为集合或其他东西

  • `sort` 仅适用于 Groovy 知道如何比较的元素(主要是 `Comparable` 对象)。更通用的解决方案是`list1 as Set == list2 as Set`。 (2认同)

Opa*_*pal 8

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

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

then:
    realResults.size() == expectedResults.size()
    realResults.containsAll(expectedResults)
    expectedResults.containsAll(realResults)
Run Code Online (Sandbox Code Playgroud)

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

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

then:
    realResults == expectedResults
Run Code Online (Sandbox Code Playgroud)

请记住,只有两个列表在相同的顺序中具有相同的元素时才相等.