在更新为androidx.fragment:fragment-testing
v1.0-alpha03之后,我们现在在测试结束时遇到了崩溃。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.Collection java.util.concurrent.ConcurrentHashMap.values()' on a null object reference
at androidx.lifecycle.ViewModel.clear(ViewModel.java:125)
at androidx.lifecycle.ViewModelStore.clear(ViewModelStore.java:62)
重要的是,这是测试我们在模拟正在使用的ViewModel
实例的情况,问题似乎与lifecycle-viewmodel
v2.1.0-alpha01的相关更改有关,而现在我们具有传递依赖项。由于mBagOfTags
为空
final void clear() {
mCleared = true;
for (Object value: mBagOfTags.values()) {
// see comment for the similar call in setTagIfAbsent
closeWithRuntimeException(value);
}
onCleared();
}
解决了这个问题,现在的标题可能有点误导。自2.1.0-alpha01更新以来,问题似乎通常与嘲笑ViewModel
实例
答案 0 :(得分:0)
因此,如上所述,该问题归结为至少从ViewModel
版本开始就无法模拟v2.1.0-alpha01
实例。原来的解决方案是改用spy()
。我正在使用Koin
,所以这意味着我的测试现在扩展了KoinTest
。然后,我可以添加以下内容进行测试
val someViewModel: SomeViewModel by inject()
然后致电关注
val spySomeViewModel = spy(someViewModel)
loadKoinModules(module {
viewModel(override = true) {
spySomeViewModel
}
})
然后,就像使用mock()
一样,可以做类似的事情
doReturn(someResult).whenever(spySomeViewModel).someMethod()
更新: 来自https://issuetracker.google.com/issues/122273087 “我们已经在https://android-review.googlesource.com/863029内部进行了修复,以确保模拟的ViewModels可以像以前一样工作,并且可以在下一版ViewModel(以及依赖于此的Fragment等)中使用。”