更新到片段测试库v1.1.0-alpha03

时间:2019-01-02 20:04:17

标签: android fragment android-architecture-components androidx android-viewmodel

在更新为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实例

1 个答案:

答案 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等)中使用。”