如何在 kotlin 的 Spring Boot 测试中从伴随对象访问 lateinit 变量?

How to access lateinit variable from companion object in SprintBoot test in kotlin?

我有一个测试 class 如下所示:

@RunWith(SpringJUnit4ClassRunner::class)
@SpringBootTest(webEnvironment= SpringBootTest.WebEnvironment.RANDOM_PORT)
class UserControllerTest{
    @Qualifier("userRepository")
    @Autowired
    private lateinit var userRepository: UserRepository

    companion object {
        @JvmStatic
        @AfterClass
        @Throws(Exception::class)
        fun cleanupAll() {
        }
    }

    @Test
    @Throws(Exception::class)
    fun testUserShouldBeCreated() {
//        Some Test
    }
}

如何从 cleanupAll 方法访问 userRepository

我试过:

companion object {
    @JvmStatic
    @AfterClass
    @Throws(Exception::class)
    fun cleanupAll() {
        UserControllerTest().userRepository.deleteAll()
    }
}

它给出错误:

kotlin.UninitializedPropertyAccessException: lateinit property userRepository has not been initialized

这个问题其实和lateinit没有关系。

您的 cleanupAll 创建了一个 new UserControllerTest。所以它不会对测试中使用的 UserRepository 做任何事情,即使它有效。

对于这种特定情况,如果一个 userRepository 应该在所有测试之间共享,它也应该在伴随对象中声明;如果不应该,那么清理方法应该在 class 中,而不是伴随对象中。