Какое надлежащее обходное решение для @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 ограничена и, как правило, следует избегать, поскольку она потенциально поощряет зависимости от времени выполнения между тестовыми примерами.

Intereting Posts
Экземпляр Kotlin KClass внутри функции расширения Свойства расширения Kotlin не работают в скрипте Kotlin В библиотеке Injekt для Kotlin, как мне вводить функции вместо значений? Могут ли функции расширения быть вызваны «статическим» способом? Несоответствие типа Котлина с дженериками Kotlin mutableMap.put возвращает значение nullable JAX-RS (Apache CXF) Контекстная инъекция через сеттер Как использовать MapBuilder в kotlin и добавить все значения? Есть ли способ перебрать все поля класса данных без использования отражения? Отражение Котлина недоступно Ошибка при запуске Android (написанного в Kotlin), скомпилированном с Gradle2.0.0-alpha плагином Kotlin: Когда функция расширения скрывает реализацию по умолчанию класса? Firebase & Retrieving Elements Intellij IDEA не показывает доступные предложения для ресурсов Android в файлах Kotlin Почему плагин Kotlin добавляет ссылку kotlin-stdlib-jre7 (не kotlin-stdlib) для Android-проекта