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

2022-09-01 08:44:43

目前,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


答案 1

JUnit 5 具有可用于此目的的注释。它启用的功能之一是非静态和方法:@TestInstance(PER_CLASS)BeforeAllAfterAll

@TestInstance(PER_CLASS)
class BeforeAllTests {

    lateinit var isInit = false

    @BeforeAll
    fun setup() {
        isInit = true
    }

   @TestFactory
   fun beforeAll() = listOf(
       should("initialize isInit in BeforeAll") {
           assertTrue(isInit)
       }
   )
}

fun should(name: String, test: () -> Unit) = DynamicTest.dynamicTest("should $name", test)

答案 2

您可以访问伴随对象中的变量:

    companion object {

        private lateinit var objectToBeInitialized: Test

        @BeforeAll
        @JvmStatic
        fun setup() {
            objectToBeInitialized = Test()
        }
    }

推荐