groovy Spock中的数组Assert

ybzsozfc  于 2023-06-05  发布在  其他
关注(0)|答案(4)|浏览(285)

我有一些物品的清单-假设是公司。现在我想检查一下这个列表中是否包含一些名字但没有考虑顺序的公司。目前我正在使用这样的结构:
companyList.name.sort() == ["First", "Second"]
Spock或Groovy中是否有任何运算符允许我不按顺序比较数组?

uttx8gqw

uttx8gqw1#

您可以在Spock中使用Hamcrest支持,并使用为这种情况明确设计的Matcher-containsInAnyOrder。您需要以下导入:

import static org.hamcrest.Matchers.containsInAnyOrder
import static spock.util.matcher.HamcrestSupport.that

然后,您可以编写测试代码如下:

given:
    def companyList = [ "Second", "First"]
expect:
    that companyList, containsInAnyOrder("First", "Second")

与使用.sort()相比,这有一个好处,即List中的重复元素将被正确考虑。使用Hamcrest时,以下测试将失败,但使用.sort()时通过

given:
    def companyList = [ "Second", "First", "Second"]
expect:
    that companyList, containsInAnyOrder("First", "Second")

Condition not satisfied:

that companyList, containsInAnyOrder("First", "Second")
|    |
|    [Second, First, Second]
false

Expected: iterable over ["First", "Second"] in any order
     but: Not matched: "Second"

如果您使用then:而不是expect:,则可以使用expect而不是that导入以提高可读性。

then:
    expect companyList, containsInAnyOrder("First", "Second")
chhkpiq4

chhkpiq42#

据我所知没有这样的接线员。如果列表不包含任何重复项,则可以使用以下Assert:

companyList.name as Set == ["First", "Second"] as Set

或者类似的东西:

companyList.name.size() == ["First", "Second"].size() && companyList.name.containsAll(["First", "Second"])
eit6fx6z

eit6fx6z3#

对@Opal的回答表示赞同,这可能是所有方面中最好的。出于好奇,我只想添加一个使用减运算符来比较两个未排序列表的例子:

import spock.lang.Specification

class ComparingListsSpec extends Specification {

    def "should contain all companies in two unsorted lists"() {
        when:
        def companies = ["Lorem", "ipsum", "dolor", "sit", "amet"]
        def unsorted = ["ipsum", "sit", "Lorem", "dolor", "amet"]

        then:
        companies - unsorted == []

        and:
        unsorted - companies == []

        and:
        companies - unsorted in [[]]
    }
}

如果其中一个列表包含冗余数据,它也可以工作。

ehxuflar

ehxuflar4#

现在Spock中有专门的匹配器available
可以使用以下运算符比较列表元素,而忽略它们的顺序:

  1. ==~-严格匹配(考虑重复元素等)
  2. =~-宽松匹配(忽略重复项)
    所以[1,2,3] ==~ [2,3,1]是真的。

相关问题