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 静态方法的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin Multiplatform(纯 kotlin)中进行延迟