我刚刚遇到了FragmentScenario,并且想用它来隔离地测试Fragments。但是我的应用程序使用Dagger,我找不到一种运行FragmentScenario并将模拟字段放入待测片段的好方法。我当前的测试设置将启动一个Activity,并使用DaggerMock来注入Mockito模拟依赖项。但是我真的很想添加隔离的片段测试。
是否可以使用FragmentScenario做到这一点?会很快得到支持吗?
我看过这篇文章提出了一种解决方案,但我不喜欢只为测试https://proandroiddev.com/testing-dagger-fragments-with-fragmentscenario-155b6ad18747
而打开片段类的想法。答案 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类更加简洁。