我的应用程序崩溃,有时在活动生命周期后调用dialog.show
。我知道这发生了什么,并希望对应用程序中发生的每个错误进行单元测试,以避免它再次出现。但是这样的事情怎么会(单位?)测试?
答案 0 :(得分:3)
难以对异常进行单元测试,因为异常消息所暗示的发生与活动生命周期紧密相关-隔离发生实际上是不可能的。
您可以使用Robolectric并尝试验证是否在dialog.show()
调用之前调用onSaveInstanceState
方法,但是我不会以这种方式解决问题。使用Robolectric进行的测试不再是单元测试。
我遇到了一些解决方案,消除了异常的发生:
FragmentTransaction
相关的方法执行的功能,并在尝试执行onSaveInstanceState
方法时识别活动是否已调用show()
。
如果活动处于created
/ started
/ resumed
状态,则可以立即执行show()
。如果不是,请存储推迟执行show()
的函数并执行下面几行伪代码:
if (isCreatedOrStartedOrResumed) {
dialog.show()
} else {
internalQueue.add {
dialog.show()
}
}
使活动返回到resumed
状态,执行所有待处理的函数
fun onResume() {
super.onResume()
while(internalQueue.isNotEmpty()) {
internalQueue.poll().invoke()
}
}
尽管这种方法不能不受配置更改的影响,但是一旦活动轮换,我们就会丢失延迟的调用。
dialog.show()
执行的函数不是匿名类-您可能最终会引入内存泄漏。测试:
我测试优雅显示的对话框的方式将是Espresso
工具测试。
我还将对存储/执行延迟执行的单元测试视图模型进行单元测试。 如果考虑使用MVP或MVVM architectural pattern构建代码,则可以将延迟执行队列存储在体系结构类成员之一中,并对其进行单元测试。
我还将加入LeakCanary作为防止内存泄漏的安全网。
可选地,我们仍然可以使用robolectric
并开发集成测试验证:
dialog.show()
之后推迟onSaveInstanceState
执行的内部队列dialog.show()
执行的内部队列已调用onSaveInstanceState
,并再次返回到resumed
状态。dialog.show()
/ created
/ started
状态,则会立即执行resumed
。这就是我目前所拥有的,希望您能找到满意的测试套件,并根据建议的方法验证对话框是否正确显示。