Как проверить генераторы на делегированные свойства?

В моем текущем проекте есть класс, который впоследствии будет реализован многими другими. Этот класс предоставляет несколько генераторов для делегированных свойств.

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 ответ

Решение

Вам нужен новый объект, созданный всякий раз, когда вы "вызываете" 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
}
Другие вопросы по тегам