Как я могу инициализировать переменную перед каждым тестом, используя kotlin-test framework

Я пытаюсь найти способ установить переменную перед каждым тестом. Точно так же, как метод @Before в Junit. Пройдя документ из kotlin-test, я обнаружил, что могу использовать интерфейс interceptTestCase(). Но, к сожалению, приведенный ниже код вызовет исключение:

kotlin.UninitializedPropertyAccessException: lateinit property text has not been initialized

class KotlinTest: StringSpec() {
lateinit var text:String
init {
    "I hope variable is be initialized before each test" {
        text shouldEqual "ABC"
    }

    "I hope variable is be initialized before each test 2" {
        text shouldEqual "ABC"
    }
}

override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
    println("interceptTestCase()")
    this.text = "ABC"
    test()
}
}

Я неправильно использую interceptTestCase()? Большое спасибо ~

2 ответа

Быстрое решение состоит в том, чтобы добавить нижеприведенный оператор в тестовый пример:
override val oneInstancePerTest = false

Основная причина заключается в том, что oneInstancePerTest имеет значение true по умолчанию (хотя в тестовом документе kotlin это значение равно false), что означает, что каждый сценарий тестирования будет выполняться в разных экземплярах.

В рассматриваемом случае инициализация interceptTestCase метод запущен в экземпляре A, установите текст в ABC. Затем тестовый пример выполнялся в экземпляре B без interceptTestCase,

Для более подробной информации, есть открытый вопрос в GitHub:
https://github.com/kotlintest/kotlintest/issues/174

Вы не инициализировали text переменная. init вызывается первым, когда вы создаете объект для класса.

Ты звонишь text shouldEqual "ABC" в init заблокировать в вашем коде, что время не будет никакого значения в text переменная.

Ваша функция interceptTestCase(context: TestCaseContext, test: () -> Unit) можно назвать только после init блок.

Инициализируйте текст в самом конструкторе, как показано ниже, чтобы не было этой ошибки или какой-либо альтернативы.

class KotlinTest(private val text: String): StringSpec()
Другие вопросы по тегам