Распределение ресурса внутри метода объектов спока в произвольных местах - PullRequest
1 голос
/ 08 ноября 2019

Внутри спокового теста мы хотим создать ресурс и убедиться, что он правильно расположен независимо от результата теста.

Мы попробовали подход, описанный ниже. Но спок не выполняет тесты, когда тестовый код помещается в замыкание.

import spock.lang.Specification

class ExampleSpec extends Specification {

    def wrapperFunction(Closure cl) {
        try {
            cl()
        } finally {
            // do custom stuff
        }
    }

    def "test wrapped in closure"() {
        wrapperFunction {
            expect:
            1 == 1
            println "will not execute!"
        }
    }
}

Каков наилучший подход к созданию и утилизации ресурса внутри теста спока.

setup()и cleanup() не являются жизнеспособными решениями, поскольку создание и удаление должны быть возможны в произвольных точках внутри метода объекта.

1 Ответ

2 голосов
/ 09 ноября 2019

Вы можете использовать блоки setup и cleanup внутри тестового примера (метод функции) следующим образом:

class ReleaseResourcesSpec extends Specification {
    void 'Resources are released'() {
        setup:
        def stream = new FileInputStream('/etc/hosts')

        when:
        throw new IllegalStateException('test')

        then:
        true

        cleanup:
        stream.close()
        println 'stream was closed'
    }
}

Код из блока cleanup всегда выполняется, хотя тест не пройден илиесли есть какие-либо исключения. См. Результат приведенного выше примера: enter image description here

Таким образом, он аналогичен методам setup() и cleanup(), но в этом случае вы можете использовать другой код настройки и очистки длякаждый метод функции.

...