Спок - настройка spe c с groovy чертой и @BeforeClass - PullRequest
0 голосов
/ 12 февраля 2020

Я пытался настроить общий массив объектов, которые загружаются и десериализуются из файла json в ресурсах, и пытался сделать это, используя черту groovy с методом setup ().

Черта:

Object[] arr

@BeforeClass
def setupTrait() {
   arr = loadFromFile("xxx.json")
}

Тест:

def setup() {}

def "test"() {
   arr.size() //here arr is null, although the setup in groovy is called
}

Рабочий раствор.

Черта:

static Object[] arr = loadFromFile("xxx.json")

Тест:

def setup() {}

def "test"() {
   arr.size() //here arr is ok.
}

Вопрос в том, почему первый не работает правильно? Если я использую аннотацию @Before и arr загружается перед каждым тестом, это как-то работает ...

1 Ответ

1 голос
/ 12 февраля 2020

Есть некоторые незначительные ошибки, которые я предлагаю переписать более «спок» -y-способом:

  • в споке вы должны использовать def setupSpec() метод фиксации, а не @BeforeClass
  • , если вы хотите инициализировать переменную в setupSpec, которая действительно будет запускаться только один раз для всех тестовых случаев, которые вы должны поместить в поле @Shared.

Но тогда, даже если код будет выглядеть так:

trait SampleTrait {
    @Shared List arr
    def setupSpec() {
        arr = [1,2,3]
    }
}

Он все равно не работает. Похоже, вы столкнулись с открытой проблемой в споке:

https://github.com/spockframework/spock/issues/83

Проблема открыта, но обходной путь существует и предлагается в обсуждение: вставьте слово stati c (вы действительно это сделали :)). Причина: @Shared аннотация не может быть обработана Споком, когда они появляются в чертах.

Итак, в целом, я считаю, лучшее, что вы можете получить, это:

trait SampleTrait {
    static List arr

    def setupSpec() {
        arr = [1,2,3]
    }
}

class SampleTestSpec extends Specification implements SampleTrait {
    def "list equality"() {
        expect:
          arr == [1,2,3]
    }
}
...