Spock 中的数组断言
Array assertion in Spock
我有一些对象的列表 - 让我们假设公司。现在我想检查此列表是否包含具有某些名称但未考虑顺序的公司。目前我正在使用这样的结构:
companyList.name.sort() == ["First", "Second"]
Spock 或 Groovy 中是否有任何运算符允许我不按顺序比较数组?
据我所知,没有这样的运营商。如果列表不包含任何重复项,则可以使用以下断言:
companyList.name as Set == ["First", "Second"] as Set
或类似的东西:
companyList.name.size() == ["First", "Second"].size() && companyList.name.containsAll(["First", "Second"])
为@Opal 的回答点赞,它可能是所有方面中最好的。出于好奇,我只会添加一个使用 minus operator 的示例来比较两个未排序的列表:
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 [[]]
}
}
如果其中一个列表包含冗余数据,它也有效。
您可以利用 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()
的好处在于列表中的重复元素将被正确考虑。以下测试使用 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")
我有一些对象的列表 - 让我们假设公司。现在我想检查此列表是否包含具有某些名称但未考虑顺序的公司。目前我正在使用这样的结构:
companyList.name.sort() == ["First", "Second"]
Spock 或 Groovy 中是否有任何运算符允许我不按顺序比较数组?
据我所知,没有这样的运营商。如果列表不包含任何重复项,则可以使用以下断言:
companyList.name as Set == ["First", "Second"] as Set
或类似的东西:
companyList.name.size() == ["First", "Second"].size() && companyList.name.containsAll(["First", "Second"])
为@Opal 的回答点赞,它可能是所有方面中最好的。出于好奇,我只会添加一个使用 minus operator 的示例来比较两个未排序的列表:
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 [[]]
}
}
如果其中一个列表包含冗余数据,它也有效。
您可以利用 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()
的好处在于列表中的重复元素将被正确考虑。以下测试使用 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")