Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法

Posted

技术标签:

【中文标题】Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法【英文标题】:Kotlin - How to manage @BeforeClass static method in springBootTest 【发布时间】:2019-01-07 18:28:25 【问题描述】:

我想在我的 springBootTest 中有一个 @BeforeClass 方法,它应该是静态的并在“companion object”中声明。

@RunWith(SpringRunner::class)
@SpringBootTest
@ActiveProfiles("test")
open class MyTest 
companion object 

    @Autowired
    lateinit var repo: MyRepository

    @BeforeClass
    @JvmStatic
    fun X() 
        user = User()
        repo.save(user)
    


另一方面,我应该在此方法中使用一些 Autowired 组件,但如前所述 here 在静态上下文中是不可能的,我收到了这个错误:

lateinit property repo has not been initialized

关于我应该如何处理这种情况的任何建议?

【问题讨论】:

Autowire 根本无法自动连接静态字段。在每次测试之前设置你的 repo,而不是在课程是你唯一真正的选择之前。 【参考方案1】:

如果您不想升级到 JUnit5,您可以使用@PostConstruct,它会产生相同的效果。示例here

【讨论】:

【参考方案2】:

我建议你切换到 Junit 5。它允许你在常规的非静态方法上使用 @BeforeAll。此外,如果您使用 Junit 5 Spring Extension,您将能够将依赖项注入您的 @BeforeAll

更新 JUnit 版本的方式取决于您使用的构建工具(Maven 或 Gradle)。您还需要将@RunWith(SpringRunner::class) 替换为@ExtendWith(SpringExtension::class)

您还需要创建属性文件src/test/resources/junit-platform.properties,其内容为:junit.jupiter.testinstance.lifecycle.default = per_class。有了这个,您将能够使用您在非静态方法上使用 @BeforeAll

看起来很多,但如果您使用 Kotlin 和 Spring Boot,JUnit 5 会更合适。

参考:使用 JUnit 5 进行测试Building web applications with Spring Boot and Kotlin

【讨论】:

谢谢。我试过你的解决方案。当我将 @RunWith(SpringRunner::class) 替换为 @ExtendWith(SpringExtension::class) 时,自动装配的组件不会被初始化。任何想法?另一个问题是@BeforeAll 方法没有被调用!我正在使用 Maven。我尝试了this answer,但仍然没有运气。 请贴出新代码​​,方便分析问题。您可以在此处查看 bean 自动装配的工作示例:github.com/fabriciolemos/kotlin-spring-boot-lab/blob/master/src/… 问题是我的 pom.xml 中的 spring-boot-starter-test 依赖项,它使用的是 junit4(除非你排除它)。我从 pom 中的 spring-boot-starter-test 中排除了 junit,现在一切正常。

以上是关于Kotlin - 如何在 springBootTest 中管理 @BeforeClass 静态方法的主要内容,如果未能解决你的问题,请参考以下文章

redis 无法创建套接字

如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟

如何在 Kotlin 中实现 Builder 模式?

如何在 Kotlin 中获取当前的本地日期和时间

如何在 Kotlin 中使用 ViewModelProviders

如何在 kotlin 中使用片段