gpt4 book ai didi

testing - Kotlintest 拦截器和 lateinit 变量

转载 作者:行者123 更新时间:2023-11-28 19:59:02 25 4
gpt4 key购买 nike

我有一些共享通用设置的测试用例。它们都需要两个可以用相同方式初始化的字段。所以我想我可以将它们提取到 lateinit var 字段中并在测试用例拦截器中创建它们。
但是当我尝试在我的测试用例中访问它们时,它们总是抛出异常,因为它们没有被初始化。
有没有办法在每个测试用例之前创建字段?

到目前为止,这是我的代码:

class ElasticsearchFieldImplTest : WordSpec() {

// These 2 are needed for every test
lateinit var mockDocument: ElasticsearchDocument
lateinit var mockProperty: KProperty<*>

override fun interceptTestCase(context: TestCaseContext, test: () -> Unit) {
// Before Each
mockDocument = mock()
mockProperty = mock {
on {name} doReturn Gen.string().generate()
}

// Execute Test
test()

// After Each
}

init {
"ElasticsearchFields" should {
"behave like normal var properties" {
val target = ElasticsearchFieldImpl<Any>()
// Here the exception is thrown
target.getValue(mockDocument, mockProperty) shouldBe null

val testValue = Gen.string().generate()
target.setValue(mockDocument, mockProperty, testValue)
target.getValue(mockDocument, mockProperty) shouldBe testValue
}
}
}
}

当我使用调试器逐步执行它并在 interceptTestCase 方法中设置断点时,我看到它在测试之前执行并且属性已初始化。然后我继续进行测试,其中的属性不再被初始化。

最佳答案

Клаус Шварц 的回答不正确。这不是 kotlintest 的工作方式 - init 中只创建 lambda,不运行。 所以你不会在 中访问你的 lateinit var >init block 。他们只是从未分配过任何值。

由于 kotlintest 中的错误,这不起作用,此处描述(实际上几乎已解决):https://github.com/kotlintest/kotlintest/issues/174

简而言之 - interceptTestCase 是在与实际测试不同的类实例上调用的。所以它对你的测试根本没有影响。

解决方法是覆盖属性:覆盖 val oneInstancePerTest = false

然后只有一个实例,interceptTestCase 可以正常工作,但您必须记住 - 所有测试只有一个实例

Kotlintest 3.0 将没有这个错误。 (但可能默认情况下所有测试都有一个实例。)

关于testing - Kotlintest 拦截器和 lateinit 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45896425/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com