当前,JUnit 5 API仅允许在静态方法上使用@BeforeAll
因此,如果我做这样的事情,它将无法编译:

@BeforeAll
  fun setup() {
    MockitoAnnotations.initMocks(this)
    mvc = MockMvcBuilders.standaloneSetup(controller).build()
}
为了在Kotlin中具有静态方法,我必须使用companion object像这样:
companion object {
    @JvmStatic
    @BeforeAll
    fun setup() {
      MockitoAnnotations.initMocks(this)
      mvc = MockMvcBuilders.standaloneSetup(smsController).build()
    }
}
这将编译,但我无法从父类访问变量。那么用Kotlin调用JUnit 5 @BeforeAll的惯用方式是什么?

最佳答案

@BeforeAll 的文档所述:



以上对于Kotlin和Java均适用。请记住,默认情况下,Junit会为每个测试用例创建一个单独的测试类实例。这是有意义的,因为@BeforeAll仅应在静态方法中使用,因为应该在当前测试用例的任何代码之前调用它。静态方法无法访问实例成员,因为可以在没有实例的情况下调用

如Spring文档所述:



该示例显示您应该只使用实例成员,如下所示:

class StandaloneTest {
  val smsController = ... // create instance of controller
  val MockMvcBuilders.standaloneSetup(smcController).build()
}
@BeforeAll的用途是有限的,通常应避免使用它,因为它可能会鼓励测试用例之间的运行时依赖性。

10-04 19:04