在我目前的项目中,有一个课程稍后将由许多其他人实施。该类为委托属性提供了一些生成器。
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)
}
答案 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
}