如何为委托属性测试生成器?

时间:2017-08-28 18:13:21

标签: testing kotlin delegated-properties

在我目前的项目中,有一个课程稍后将由许多其他人实施。该类为委托属性提供了一些生成器。

abstract class BaseClass {
    protected val delegated1 get() = new Delegated1Impl()
    protected val delegated2 get() = new Delegated2Impl()
    ...
}

这个基类可以这样使用:

class Example : BaseClass() {
    var field1 by delegated1
    var field2 by delegated2
}

现在我想测试这些委托的生成器。其中一些包含我想要测试的逻辑,但是现在我只想知道每次调用它们都返回一个新实例。

现在我的问题是:如何测试这些发电机?
生成器在扩展类之外是不可见的,所以我不能简单地创建它的实例并调用这些方法。

@Test
fun `delegated1 should always return a new instance`() {
    val target = object: BaseClass()

    val first = target.delegated1    // This does not work since it is protected
    val second = target.delegated1

    assertTrue(first !== second)
}

1 个答案:

答案 0 :(得分:0)

只要“调用”get方法,就需要创建一个新对象。那么如何测试呢?使用提供商

Provider<T>只是一个为您提供具体类的新实例的对象。它的签名是这样的:

interface Provider<T> {
    fun get() : T
}

因此,您需要在Provider<T>

中注入新的BaseClass
abstract class BaseClass(
        private val implementation1Provider : Provider<YourInterface>,
        private val implementation2Provider : Provider<YourInterface>) {
    protected val delegated1 get() = implementation1Provider.get()
    protected val delegated2 get() = implementation2Provider.get()
    ...
}

现在,您可以在测试中注入自定义提供程序并断言它们已被调用:

@Test
fun `delegated1 should always return a new instance`() {
    val implementation1Provider = ...
    val target = Example(implementation1Provider, ...)

    val first = target.field1

    // assert that implementation1Provider.get() has been called
}