【问题标题】:Issue with lateinit in test case测试用例中的lateinit问题
【发布时间】:2019-11-25 11:37:40
【问题描述】:

我有一个像下面这样的 kotlin Ut

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
internal class FileOpenerTest {

    private val file = mockk<Resource>()
    private lateinit var target: FileOpener

    @BeforeAll
    fun setup() {
        val file = File("./src/test/resources/sample.csv")
        every { file.file } returns file
        target = FileOpener(file)
    }

    @Test
    fun `get  documents for indexing from  file`() {
        val docs = target.startIndexing()
        verify { docs.size == 3 }
    }
}

测试用例总是失败说

kotlin.UninitializedPropertyAccessException:lateinit 属性目标尚未初始化

但是我是在setup方法中初始化的,请帮我解决这个问题?

【问题讨论】:

  • 不应该在 static 方法上使用@BeforeAll 吗?您可能想改用@Setup

标签: unit-testing kotlin junit


【解决方案1】:

您的设置注释@BeforeAll 仅应用于静态函数:

@BeforeAll 注解的方法必须是静态方法,否则会抛出运行时错误。

Source

所以你的方法没有在 JUnit 中执行。要么把方法和字段放在你的伴生对象中,要么用不同的方式初始化它,比如@Before

【讨论】:

  • 在 kotlin 中没有 static 关键字。还有一个现有的 UT 可以与 @BeforeAll 一起正常工作。
  • 1.这就是为什么我建议把它放在companion object 里面。 2. 你有没有调试过测试文件,可以在测试开始前到达@BeforeAll里面的initilisation?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多