在Kotlin中使用@ClassRule

luj*_*jop 20 junit4 kotlin

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

我试过了:

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

and 

object companion {
    @ClassRule @JvmField
    val managedMongoDb = ...    
}
Run Code Online (Sandbox Code Playgroud)

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

我仔细检查了完全相同的规则在没有静态上下文的情

@Rule @JvmField
val managedMongoDb = ...
Run Code Online (Sandbox Code Playgroud)

Jay*_*ard 25

您没有正确使用伴随对象.您正在声明一个对象(类的单个实例),companion而不是创建companion object一个类的内部.因此,无法正确创建静态字段.

class TestClass {
    companion object { ... }
}
Run Code Online (Sandbox Code Playgroud)

与以下内容截然不同:

class TestClass { 
    object companion { ... } // this is an object declaration, not a companion object
}
Run Code Online (Sandbox Code Playgroud)

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

这是@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...")
    }
}
Run Code Online (Sandbox Code Playgroud)

这输出:

测试前的 ClassRule
...
ClassRule之后

  • 哦,我这个愚蠢的新手错误.谢谢 :) (2认同)
  • `object companion {...}`不是一个对象表达式,而是一个根据https://kotlinlang.org/docs/reference/object-declarations.html的对象声明. (2认同)