我刚刚在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崩溃。
那么我做错了什么?
答案 0 :(得分:1)
您想在测试中检查的内容至少可能是这样:
LifecycleListener
已添加到ViewKontroller
onPostAttach
调用ViewKontroller
时会发生一些事情preDestroyView
调用ViewKontroller
时会发生其他事情因此,传递给构造函数的ViewKontroller
的测试双重需要“告诉”您是否已注册侦听器,还需要将方法调用委托给该侦听器。
在这种情况下,当测试双重对象需要具有一些实际功能时,最好实现虚假而不是使用模拟。
在您的情况下,只需实现扩展FakeViewKontroller
的{{1}}并将其传递给受测试的系统而不是模拟。
在该类中,您可以公开其他方法,以确保添加ViewKontroller
,并在测试用例中调用该侦听器上的方法。