Я пытаюсь найти способ настроить переменную перед каждым тестом. Также как метод @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()