Как утверждать в Споке, что список содержит только какой-то определенный элемент? - PullRequest
0 голосов
/ 30 апреля 2019

В чистом Spock / Groovy мне нужно два отдельных утверждения, чтобы убедиться, что список содержит какой-то элемент и ничего больше:

def "list has single element"() {
    given:
    def list = ['x']

    expect:
    list.size() == 1
    list.first() == 'x'
}

Я могу сделать это утверждение однострочным, используя зависимость Guava:

    expect:
    Iterables.getOnlyElement(list) == 'x'

Есть ли способ сделать то же самое в одной строке в чистом Groovy / Spock?Я не хочу слишком часто использовать Гуаву в своих тестах.

РЕДАКТИРОВАТЬ

На самом деле для такого простого примера достаточно просто list == ['x'].Я ищу негуавское решение для чего-то более сложного, когда необходимо выполнить несколько утверждений для этого единственного элемента:

  def "list has single element"() {
        given:
        def list = [5.0]

        expect:
        def bigDecimal = Iterables.getOnlyElement(list)
        bigDecimal.scale() == 1
        bigDecimal.precision() == 2
    }

1 Ответ

1 голос
/ 01 мая 2019

Если приемлемо создание вспомогательного метода, можно использовать with():

def "list has single element"() {
    given:
    def list = [5.0]

    expect:
    with onlyElementOf(list), {
        it.scale() == 1
        it.precision() == 2
    }
}

, где onlyElementOf() равно

 static <T> T onlyElementOf(Iterable<T> iterable) {
    Iterator iterator = iterable.iterator()
    def first = iterator.next()
    assert !iterator.hasNext(), "Iterable has more than 1 element"
    return first
}

Это делает тест довольно читабельным.

...