Я использовал решение для аналогичного сценария на уровне активности, см. Как повторно внедрить объект Android, (Service, Activity ...), вводимый AndroidInjector, в другие объекты? для справки.
Как мы можем применить это решение
рассмотреть:
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 с вашим реальным кодом несколько чище.