在Kotlin中使用@ClassRule

时间:2016-03-05 22:55:11

标签: junit4 kotlin

在JUnit中,您可以使用@ClassRule注释静态字段。 我怎么能在Kotlin做到这一点?

我试过了:

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

and 

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

但最后一个都没有,因为规则没有被执行。

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

@Rule @JvmField
val managedMongoDb = ...

1 个答案:

答案 0 :(得分:22)

您没有正确使用companion objects。您正在声明一个名为companion的对象(类的单个实例),而不是在类中创建companion object。因此,静态字段无法正确创建。

class TestClass {
    companion object { ... }
}

与以下内容截然不同:

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

虽然两者都是有效的代码。

以下是在Kotlin 1.0.0中使用@ClassRule的正确工作示例:

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
相关问题