Утверждение массива в Споке

115
12

У меня есть список некоторых объектов - пусть принимают компании. Теперь я хочу проверить, содержит ли этот список компании с именами, но не учитывает порядок. В настоящее время я использую такую ​​конструкцию:


companyList.name.sort() == ["First", "Second"]


Есть ли какой-либо оператор в Spock или Groovy, который позволяет мне сравнивать массивы без заказа?

спросил(а) 2015-02-11T13:02:00+03:00 6 лет, 2 месяца назад
1
Решение
157

Нет такого оператора, насколько я знаю. Если список не содержит дубликатов, можно использовать следующее утверждение:


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

Или что-то в этом роде:


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

ответил(а) 2015-02-11T13:06:00+03:00 6 лет, 2 месяца назад
122

Вы можете использовать поддержку Hamcrest в Spock и использовать 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")

ответил(а) 2015-10-03T21:47:00+03:00 5 лет, 6 месяцев назад
62

Приобретено для ответа @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 [[]]
}
}


Он также работает, если один из списков содержит избыточные данные.

ответил(а) 2015-02-11T23:03:00+03:00 6 лет, 2 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема