在科特林中使用@ClassRule

Use @ClassRule in Kotlin

在 JUnit 中,您可以使用 @ClassRule 来注释静态字段。 我如何在 Kotlin 中执行此操作?

我试过了:

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

and 

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

但最后的 none 有效,因为规则未执行。

我仔细检查了完全相同的规则在没有静态上下文的情况下也能正常工作:

@Rule @JvmField
val managedMongoDb = ...

您没有正确使用 companion objects。您正在声明一个名为 companion 的对象(class 的单个实例),而不是在 class 中创建一个 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 Before
Testing...
ClassRule After