禁用测试中的Dagger注入

禁用测试中的Dagger注入,第1张

概述我有以下使用Dagger注入其字段的LoginFragment:classLoginFragment:DaggerFragment(){@InjectlateinitvarviewModelFactory:ViewModelProvider.FactoryoverridefunonActivityCreated(savedInstanceState:Bundle?){super.onActivityCreated(s

我有以下使用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注入所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1091926.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存