0

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

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)
}
4

1 回答 1

0

每当您“调用”该get方法时,您都需要创建一个新对象。那么如何测试呢?与提供商

AProvider<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
}
于 2017-08-28T18:28:31.877 回答