有没有其他人遇到过类似的问题,详细信息是: 在早期版本的 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/