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

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

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 } 

Поэтому вам нужно ввести новый 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 } 
Intereting Posts
API автозаполнения Google Places дает ошибку API_NOT_CONNECTED в конфигурации Instant Apps Android Studio 3.0 Proguard с использованием kotlin & greendao возвращает ClassLookupException Как разбирать JSON с URL-адреса, используя Kotlin на Android? Обработчик комментариев Kotlin: он не может заставить его работать Предварительные условия в Котлине – хорошие практики Как узнать, работает ли приложение загрузки Spring в режиме отладки? Связи сущностей в Android-комнате Kotlin: Как проверить, имеет ли число десятичные точки (решение модуля не работает) Обмен узлом в Guava MutableValueGraph Почему Kotlin получает такое UndeclaredThrowableException, а не исключение ParseException? Как разрешить нарушение ограничения конечного ограничения в Котлине? RxAndroid, Как обнаружить, если наблюдаемое закончило излучение Странное поведение compose и ObservableTransformer в RxJava, когда переданный родословный расширяет что-то Конфигурация безопасности пружины Kotlin Классы хранения на языке программирования Kotlin