android - 无法从 androidx.fragment.app.Fragment.getViewModelStore 处的分离 fragment 访问 spy ( fragment )对象的 ViewModel

标签 android android-fragments robolectric

enter image description here

有没有其他人遇到过类似的问题,详细信息是: 在早期版本的 androidx.fragment:fragment-testing:1.4.1 库中,基于 mockito 的测试通过,但在将库升级到 1.5.3 版本后,测试失败并给出此错误。

用于测试 fragment 的代码:

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 ),然后尝试运行代码(测试),它就会因上述错误而中断。

也浏览了库的更改文档,但没有提到有关fragmentmanager的具体内容。 https://developer.android.com/jetpack/androidx/releases/fragment#1.5.4 release version documentation

我尝试过:

  • 传递确实通过了测试用例的 fragment 对象,但 spy ( fragment )在1.5.3版本的库中给出错误,并且相同的代码直到1.4.3库为止。

  • 尝试了 fragementScenario 基于测试用例,但也无法加载 fragment ,并且在运行测试时出现相同的错误。

  • 我仅在测试中出现错误(基于 Roboelectric 和 mockito 的测试)

  • 这是我传递的 fragment 对象 MyFragment(联系人、 View 模型、fragmentManger) viewmodel和fragment是mock对象,而contact只是数据对象)

最佳答案

我也遇到过这个问题。您可以使用 Mockito.spy(Class<T>) 进行修复重载而不是构造 fragment 并使用 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

如果您首先实例化 fragment ,Fragment现在构造一个 LifecycleRegistry引用它本身。然后当你 spy()对于该实例,Mockito 会构造另一个具有自己生命周期的(模拟的)实例。这会在附加侦查 fragment 时导致问题。

通过使用 spy(Class<T>) ,仅创建该 fragment 的一个实例。

关于android - 无法从 androidx.fragment.app.Fragment.getViewModelStore 处的分离 fragment 访问 spy ( fragment )对象的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74232941/

相关文章:

android - ActionBar 选项卡 - 用详细信息 fragment 替换列表 fragment

android - 你可以使用服务中的 LoaderManager 吗?

android - JaCoCo 不适用于 Robolectric 测试

java - 使用 PowerMock 和 Robolectric - IncompatibleClassChangeError

android - 为什么 Kotlin 数据类对象有反引号?

android - Firebase 2.0 - 如何处理安卓应用程序的多种风格(环境)?

android - 如何在应用程序中创建语音 Activity ?

java - 在自定义 View 中触摸和删除触摸时绘制圆圈

android - 在新 Activity 中从一个 fragment 到另一个 fragment 的共享元素转换

android - 使用 Robolectric 3.0 测试 fragment