【问题标题】:Use @ClassRule in Kotlin在 Kotlin 中使用 @ClassRule
【发布时间】:2016-03-05 22:55:10
【问题描述】:

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

我试过了:

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

and 

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

但最后一个都不起作用,因为没有执行规则。

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

@Rule @JvmField
val managedMongoDb = ...

【问题讨论】:

  • 前两个版本有什么区别?
  • 一个使用@JvmStatic 和其他JvmField。据我了解,我想重现一个静态字段,第一个是要使用的,但我也尝试了第二个。

标签: junit4 kotlin


【解决方案1】:

您没有正确使用companion objects。您正在声明一个名为 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 之前
测试...
之后的类规则

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2019-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
相关资源
最近更新 更多