我有以下使用Dagger注入其字段的LoginFragment:
class LoginFragment : DaggerFragment() { @Inject lateinit var viewmodelFactory: viewmodelProvIDer.Factory overrIDe fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) viewmodel = viewmodelProvIDers.of(this, viewmodelFactory) .get(Loginviewmodel::class.java) }
我也有一个相应的测试,该测试根据Google的文档模拟了Loginviewmodel:“您可以创建该片段并为其提供模拟viewmodel.”
@MediumTest@RunWith(AndroIDJUnit4::class)class LoginFragmentTest { @Mock private lateinit var viewmodel: Loginviewmodel @Before fun setUp() { loginFragment = LoginFragment() loginFragment.viewmodelFactory = createMockviewmodelFactory(viewmodel) activityRule.activity.setFragment(loginFragment) }}
问题在于,当调用片段的onAttached方法时,Dagger用其自己的对象覆盖viewmodelFactory,从而替换了我的模拟对象.
如何防止Dagger覆盖我的模拟对象?
解决方法:
在Github上的android-architecture-components个示例中,Google提供了一个有趣的解决方案.
他们将inject的活动穿过了ActivityLifecycleCallbacks.对于已进行测试的测试,他们使用的是TestApp,它未注册ActivitylifecycleCallbacks,因此不会注入任何内容.
就像您的示例中的viewmodel.Factory是包私有的一样,因此在测试中您可以自己分配它.
对于片段,可以使用FragmentManager.FragmentLifecycleCallbacks类.您的生产活动将使用FragmentlifecycleCallbacks来插入Fragment,而不是在onActivityCreated中自己插入Fragment.您可以创建一个不插入片段的测试活动,也可以自己创建一个模拟工厂.
总结以上是内存溢出为你收集整理的禁用测试中的Dagger注入全部内容,希望文章能够帮你解决禁用测试中的Dagger注入所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)