这是我的 MWE 测试类,它依赖于 AndroidX、JUnit 4 和 MockK 1.9:
class ViewModelOnClearedTest {
@Test
fun `MyViewModel#onCleared calls Object#function`() = mockkObject(Object) {
MyViewModel::class.members
.single { it.name == "onCleared" }
.apply { isAccessible = true }
.call(MyViewModel())
verify { Object.function() }
}
}
class MyViewModel : ViewModel() {
override fun onCleared() = Object.function()
}
object Object {
fun function() {}
}
注意:该方法在父类(super class) ViewModel
中受到保护。
我想验证 MyViewModel#onCleared
是否调用了 Object#function
。上面的代码通过反射完成了这个。我的问题是:我能否以某种方式运行或模拟 Android 系统,以便调用 onCleared
方法,这样我就不需要反射了?
来自 onCleared
JavaDoc:
This method will be called when this ViewModel is no longer used and will be destroyed.
所以,换句话说,我如何创建这种情况,以便我知道调用了 onCleared
并且我可以验证它的行为?
最佳答案
在 kotlin 中,您可以使用 public
覆盖 protected 可见性,然后从测试中调用它。
class MyViewModel: ViewModel() {
public override fun onCleared() {
///...
}
}
关于android - 如何确保在 Android 单元测试中调用 ViewModel#onCleared?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54115627/