¿Cómo pruebo generadores para properties delegadas?

En mi proyecto actual hay una class que luego será implementada por muchos otros. Esta class proporciona algunos generadores para properties delegadas.

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

Esta class base se puede usar de esta manera:

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

Ahora quiero probar estos generadores delegates. Algunos de ellos contienen lógica que quiero probar, pero por ahora solo quiero saber que cada vez que se los llama devuelven una nueva instancia.

Ahora mi pregunta es: ¿cómo puedo probar estos generadores?
Los generadores no son visibles fuera de la extensión de las classs, así que no puedo simplemente crear una instancia y llamar a estos methods.

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

Necesita un nuevo object creado siempre que "llame" al método get . Entonces, ¿cómo probarlo? Con un proveedor

Un Provider<T> es solo un object que le proporciona nuevas instancias de una class concreta. Su firma es algo como esto:

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

Entonces necesita inyectar un nuevo Provider<T> en su 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() ... } 

Ahora puede inyectar sus proveedores personalizados en la testing y afirmar que se los ha llamado:

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