Я пытаюсь шпионить (с помощью Mockito Spy) экземпляра класса kotlin с делегированным свойством (by lazy
), функция инициализации которого зависит от свойства lateinit
, но по какой-то причине шпион делаетделегированное имущество оцениваться преждевременно. Есть ли способ предотвратить это?
Это упрощенная версия класса, которую я пытаюсь шпионить.
open class Presenter() {
private lateinit var param1: String
private val delegate: Delegate by lazy {
if (param1 == "1"){
object: Delegate {
override fun doSomething() = println("Delegate Impl 1")
}
} else {
object: Delegate {
override fun doSomething() = println("Delegate Impl 2")
}
}
}
fun attachView(view: Any, param1: String) {
this.param1 = param1
}
fun doSomething() {
delegate.doSomething()
}
}
interface Delegate {
fun doSomething()
}
И это тест, в котором я пытаюсьиспользовать шпиона над реальным экземпляром.
@Test
fun myTest() {
val presenterSpy = spy(Presenter())
presenterSpy.attachView("MyView","1")
presenterSpy.doSomething()
}
Остальная часть теста была пропущена, поскольку она вылетает в третьей строке, выдавая следующую ошибку:
kotlin.UninitializedPropertyAccessException: lateinit property param1 has not been initialized
Стоит отметить, что когда я использую реальный экземпляр вместошпиона он работает просто отлично.
UPDATE: Одним из решений является перемещение экземпляра делегата в метод attachView
.
open class Presenter() {
private lateinit var param1: String
private lateinit var delegate: Delegate
fun attachView(view: Any, param1: String) {
this.param1 = param1
delegate = if (param1 == "1"){
object: Delegate {
override fun doSomething() = println("Delegate Impl 1")
}
} else {
object: Delegate {
override fun doSomething() = println("Delegate Impl 2")
}
}
}
fun doSomething() {
delegate.doSomething()
}
}
Однако мне больше интересно узнать, почему свойство lazy
оценивается раньше времени при шпионаже.