如何使用在函数内设置的匿名侦听器测试类?

时间:2017-12-13 16:18:45

标签: android unit-testing kotlin

我刚刚在Android上进行单元测试,当我尝试测试此类的bindTo()函数时遇到了一些困难。

class DataFlow<T> (produce: DataFlowProducer<T>): BaseDataFlow<T>(produce) {
    var updateOnAttach: Boolean = true

    fun bindTo(viewKontroller: ViewKontroller, updateImmediately: Boolean, updateUi: (data: T) -> Unit) {
        this.updateUi = updateUi
        if (updateImmediately)
            flow()
        viewKontroller.addLifecycleListener(object : Controller.LifecycleListener() {
            override fun postAttach(controller: Controller, view: View) {
                if (updateOnAttach) flow()
            }
            override fun preDestroyView(controller: Controller, view: View) {
                viewKontroller.removeLifecycleListener(this)
                this@DataFlow.updateUi = null
            }
        })
    }
}

如果我模拟我的ViewKontroller测试仍然在线viewKontroller.addLifecycleListener上与NPE崩溃。

那么我做错了什么?

1 个答案:

答案 0 :(得分:1)

您想在测试中检查的内容至少可能是这样:

  1. LifecycleListener已添加到ViewKontroller
  2. onPostAttach调用ViewKontroller时会发生一些事情
  3. preDestroyView调用ViewKontroller时会发生其他事情
  4. 因此,传递给构造函数的ViewKontroller的测试双重需要“告诉”您是否已注册侦听器,还需要将方法调用委托给该侦听器。

    在这种情况下,当测试双重对象需要具有一些实际功能时,最好实现虚假而不是使用模拟。

    在您的情况下,只需实现扩展FakeViewKontroller的{​​{1}}并将其传递给受测试的系统而不是模拟。

    在该类中,您可以公开其他方法,以确保添加ViewKontroller,并在测试用例中调用该侦听器上的方法。