Использовать @ClassRule в Котлине

В JUnit вы можете использовать @ClassRule для аннотирования статического поля. Как я могу сделать это в Котлине?

Я пробовал:

object companion {
    @ClassRule @JvmStatic
    val managedMongoDb = ...    
}

and 

object companion {
    @ClassRule @JvmField
    val managedMongoDb = ...    
}

но ни одно из последних не работает, потому что правило не выполняется.

Я дважды проверил, что точно такое же правило отлично работает без статического контекста:

@Rule @JvmField
val managedMongoDb = ...

Ответ 1

Вы не используете сопутствующие объекты правильно. Вы объявляете объект (единственный экземпляр класса) под названием companion вместо создания companion object внутри класса. И поэтому статические поля создаются неправильно.

class TestClass {
    companion object { ... }
}

Очень отличается от:

class TestClass { 
    object companion { ... } // this is an object declaration, not a companion object
}

Хотя оба кода являются действительными.

Вот правильный рабочий пример использования @ClassRule, проверенный в Kotlin 1.0.0:

class TestWithRule {
    companion object {
        @ClassRule @JvmField
        val resource: ExternalResource = object : ExternalResource() {
            override fun before() {
                println("ClassRule Before")
            }

            override fun after() {
                println("ClassRule After")
            }
        }
    }

    @Test fun testSomething() {
        println("Testing...")
    }
}

Выводится:

ClassRule До
Тестирование...
ClassRule After