无法从spy(fragment)对象的androidx.fragment.app.Fragment.getViewModelStore中的分离片段访问ViewModels

6vl6ewon  于 2023-06-20  发布在  Android
关注(0)|答案(1)|浏览(111)

有没有人遇到过类似的问题,详情如下:在早期版本的androidx.fragment:fragment-testing:1.4.1库中,基于mockito的测试通过,但在将库升级到1.5.3版本后,测试失败,并给出此错误。
用于测试片段的代码:

activity = Robolectric.buildActivity(AppCompatActivity::class.java).setup().get()
activity.supportFragmentManager.beginTransaction().add(android.R.id.content, fragment).commit()
if (idleLooper) {
    shadowOf(getMainLooper()).idle()
}

这里如果我传递普通的fragment对象,测试运行,它继续运行测试,但是如果我传递spy(fragment),然后尝试运行code(test),它会中断上面的错误。
我也浏览了库的更改文档,但没有提到关于fragmentmanager的任何具体内容。https://developer.android.com/jetpack/androidx/releases/fragment#1.5.4release版本文档
我试过:

  • 传递fragment对象,该对象确实通过了测试用例,但spy(fragment)在1.5.3版本的库中给出了错误,并且相同的代码直到1.4.3库才通过。
  • 尝试fragmentScenario基于测试用例,但也无法加载片段,并且在运行测试时出现相同的错误。
  • 我有错误的测试只有(Roboelectric &基于mockito的测试)
  • 这里是我传递给MyFragment(contact,viewmodel,fragmentManger)的fragment对象,viewmodel和fragment是模拟对象,contact只是数据对象)
8qgya5xd

8qgya5xd1#

我也碰到了这个。您可以通过使用Mockito.spy(Class<T>)重载来修复,而不是构造片段并使用Mockito.spy(Object)
例如,假设mockito-kotlin:

val fragment = spy<MyFragment>()
// instead of:
val fragment = spy(MyFragment())

更多详情:
androidx:fragment的相关变化如下:https://cs.android.com/androidx/platform/frameworks/support/+/b651a62816e8005a0e1c7fbd3435c01820f4c015
如果您先insantiate片段,Fragment现在会构造一个引用自身的LifecycleRegistry。然后,当您spy()示例时,Mockito会构造另一个(模拟)示例,并具有自己的生命周期。这在附加间谍片段时会导致问题。
通过使用spy(Class<T>),只创建片段的一个示例。

相关问题