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

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

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

您需要在“调用” get方法时创建一个新对象。 那么如何测试呢? 与一个提供者

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

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

所以你需要在你的BaseClass注入一个新的Provider<T>

 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 }