有没有一种简单的方法可以在使用FragmentScenario的测试中注入匕首模拟?

时间:2019-07-08 23:20:50

标签: android android-fragments mockito android-espresso dagger

我刚刚遇到了FragmentScenario,并且想用它来隔离地测试Fragments。但是我的应用程序使用Dagger,我找不到一种运行FragmentScenario并将模拟字段放入待测片段的好方法。我当前的测试设置将启动一个Activity,并使用DaggerMock来注入Mockito模拟依赖项。但是我真的很想添加隔离的片段测试。

是否可以使用FragmentScenario做到这一点?会很快得到支持吗?

我看过这篇文章提出了一种解决方案,但我不喜欢只为测试https://proandroiddev.com/testing-dagger-fragments-with-fragmentscenario-155b6ad18747

而打开片段类的想法。

1 个答案:

答案 0 :(得分:0)

我在活动级别针对类似情况使用了解决方案,请参阅How do you re-inject an android object, (Service, Activity...) being injected into by an AndroidInjector, into other objects?以供参考。

我们如何应用此解决方案

考虑:

class MyFragment extends Fragment
{
 ....
}

创建一个子类:

class MyFragmentInjector extends MyFragment
{
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup 
      container,  @Nullable Bundle savedInstanceState) {
      initialiseDependencies();
      super.onCreateView(inflater, container, savedInstanceState);
   }

   public void initialiseDependencies()
   {
      DaggerMyFragmentComponent.Factory.create().inject(this);
   }
}

成为测试实现子类

class MyFragmentInjectorTestImpl extends MyFragment
{
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup 
      container,  @Nullable Bundle savedInstanceState) {
      initialiseDependencies();
      super.onCreateView(inflater, container, savedInstanceState);
   }

   public void initialiseDependencies()
   {
      DaggerMyFragmentTestComponent.Factory.create().inject(this);
   }
}

您的测试组件将包含所有模拟的模块以替换您的真实模块:

这意味着要进行测试,您将具有:

FragmentScenario.launch(MyFragmentInjectorTestImpl.class);

并使用

 FragmentScenario.FragmentAction<MyFragmentInjectorTestImpl> mAction;

但是由于MyFragmentInjectorTestImpl仍然是MyFragment的实例,因此您将在注入模拟依赖项的情况下测试MyFragment。

问题在于所有这些初始化都必须在子类级别完成(因为它需要将依赖项注入到其父级中),这并不理想,如果您有很多片段,似乎有很多不必要的额外类实现,但这意味着带有实际代码的MyFragment类更加简洁。