Есть ли простой способ ввести кинжалы в тестах с использованием FragmentScenario? - PullRequest
0 голосов
/ 09 июля 2019

Я только что натолкнулся на FragmentScenario и хотел бы использовать его для тестирования фрагментов в отдельности.Но в моем приложении используется Dagger, и я не могу найти хороший способ запустить FragmentScenario и вставить макеты полей в тестируемый фрагмент.Моя текущая тестовая установка запускает Activity и использует DaggerMock для внедрения mockito mock-зависимостей.Однако я бы очень хотел добавить отдельные тесты фрагментов.

Возможно ли это сделать с помощью FragmentScenario?Будет ли она поддерживаться в ближайшее время?

Я видел эту статью, предлагающую решение, но мне не нравится идея открывать классы фрагментов только для тестирования https://proandroiddev.com/testing-dagger-fragments-with-fragmentscenario-155b6ad18747

1 Ответ

0 голосов
/ 13 июля 2019

Я использовал решение для аналогичного сценария на уровне активности, см. Как повторно внедрить объект 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 с вашим реальным кодом несколько чище.

...