Mockito Spy делает преждевременной оценку свойств делегатов (по ленивости) - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь шпионить (с помощью 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 оценивается раньше времени при шпионаже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...