0

更新到androidx.fragment:fragment-testingv1.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-viewmodelv2.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();
}

解决了这个问题后,现在的标题可能有点误导。ViewModel自 2.1.0-alpha01 更新以来,问题似乎通常与模拟实例有关

4

1 回答 1

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内部修复了这个问题,以确保模拟的 ViewModel 像以前一样工作并且这将可用在下一版本的 ViewModel(以及依赖它的 Fragment 等)中。”

于 2019-01-07T18:20:36.507 回答