Kotlin中@BeforeAll的正确解决方法是什么?

目前JUNIT5 API只允许@BeforeAll在静态的方法上

所以如果这样做,这将不会编译:

@BeforeAll fun setup() { MockitoAnnotations.initMocks(this) mvc = MockMvcBuilders.standaloneSetup(controller).build() } 

所以为了在Kotlin中有静态的方法,我必须把这样的伴侣对象放进去:

 companion object { @JvmStatic @BeforeAll fun setup() { MockitoAnnotations.initMocks(this) mvc = MockMvcBuilders.standaloneSetup(smsController).build() } } 

这将编译,但我没有访问父类的变量。 那么用Kotlin调用JUnit5的@BeforeAll会是怎样的习惯用法呢?

正如@BeforeAll的文档中@BeforeAll

表示注释的方法应该在当前类的所有@Test方法之前执行; 类似于JUnit 4的@BeforeClass。 这样的方法必须是静态的,并且是继承的。

Kotlin和Java都是如此。 请记住,默认情况下,Junit将为每个测试用例创建一个单独的测试类实例。 有意义的是, @BeforeAll只能用于静态方法,因为它应该在当前测试用例的任何代码之前被调用。 静态方法不能访问实例成员,因为它可以在没有实例的情况下被调用

正如Spring文档所述:

另一方面,“standaloneSetup”更接近单元测试。

这个例子显示你应该像这样使用实例成员:

 class StandaloneTest { val smsController = ... // create instance of controller val MockMvcBuilders.standaloneSetup(smcController).build() } 

@BeforeAll的用处是有限的,通常应该避免,因为它可能会激发测试用例之间的运行时依赖关系。