Какое надлежащее обходное решение для @BeforeAll в Котлине

В настоящее время API JUNIT5 разрешает только @BeforeAll только для статического метода

так что если делать так, и это не скомпилируется:

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

поэтому для того, чтобы иметь статический метод в Котлине, я должен добавить в объект-компаньон следующим образом:

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

Это будет скомпилировано, но у меня нет доступа к переменным из родительского класса. Итак, каков был бы идиоматический способ вызвать @BeforeAll JUnit5 с Kotlin?

Как указано в документации @BeforeAll :

Обозначает, что аннотированный метод должен быть выполнен перед всеми методами @Test в текущем классе; аналогично JUnit 4's @BeforeClass. Такие методы должны быть статическими и наследоваться.

Вышеизложенное верно как для Kotlin, так и для Java. Имейте в виду, что по умолчанию Junit создаст отдельный экземпляр тестового класса для каждого тестового примера. Имеет смысл, что @BeforeAll будет работать только со статическими методами, поскольку он должен быть вызван перед любым кодом текущего тестового примера. Статический метод не имеет доступа к членам экземпляра, потому что он может быть вызван без экземпляра.

Как указано в весенней документации:

С другой стороны, «standaloneSetup» немного ближе к единичному тесту.

Пример показывает, что вам следует просто использовать экземпляры экземпляра:

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

Полезность @BeforeAll ограничена и, как правило, следует избегать, поскольку она потенциально поощряет зависимости от времени выполнения между тестовыми примерами.