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)
或者将它们转换为集合或其他东西
如果您只需要检查两个列表是否具有相同的元素您可以尝试:
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)
请记住,只有两个列表在相同的顺序中具有相同的元素时才相等.