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

Я пытаюсь найти способ настроить переменную перед каждым тестом. Также как метод @Before в Junit. Пройдите через doc из 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 ()? Большое спасибо ~

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

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

В рассматриваемом случае инициализирующий метод 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()