Тестирование JUnit для Android-приложения с фрагментами

Мое приложение для Android было создано на основе Single Activity, основанной на нескольких фрагментах. Мне нужно сделать модульное тестирование для приложения. Я могу написать тестовые модули для приложения, которое содержит все действия с использованием ActivityInstrumentationTestCase2 JUnit, но не для приложения, содержащего фрагменты. Пожалуйста, предложите способ написания тестовых примеров JUnit для фрагментов.

Спасибо

Ответ 1

Смотрите Android: тестирование фрагментов

Скопировано для удовольствия чтения с изменениями, сделанными для getFragmentManager() и getSupportFragmentManager() и android: exported = "false":

Если вы хотите протестировать фрагмент изолированно, вам нужно создать Test FragmentActivity, чтобы ваш тест мог его использовать. Тестовая активность будет выглядеть примерно так. Не забудьте объявить его в манифесте приложений:

 public class TestFragmentActivity extends FragmentActivity {
   @Override
   protected void onCreate(Bundle arg0) {
     super.onCreate(arg0);
     setContentView(R.layout.activity_fortests);
   }
 }

Разметка:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
   <LinearLayout
        android:id="@+id/activity_test_fragment_linearlayout"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        />
 </RelativeLayout>

AndroidManifest:

 ...
 <activity
  android:name="your.package.name.TestFragmentActivity"
  android:exported="false" />
 ...

Затем в вашем тестовом проекте вы можете создать такой класс, чтобы запустить фрагмент:

  public class FrameworkObjectsGeneratorFragmentTest 
      extends ActivityInstrumentationTestCase2<TestFragmentActivity> {
    private TestFragmentActivity mActivity;

    public FrameworkObjectsGeneratorFragmentTest() {
      super(TestFragmentActivity.class);
    }

    @Override
    protected void setUp() throws Exception {
      super.setUp();
      mActivity = getActivity();
    }

    private Fragment startFragment(Fragment fragment) {
      FragmentTransaction transaction = mActivity.getFragmentManager().beginTransaction();
      transaction.add(R.id.activity_test_fragment_linearlayout, fragment, "tag");
      transaction.commit();
      getInstrumentation().waitForIdleSync();
      Fragment frag = mActivity.getFragmentManager().findFragmentByTag("tag");
      return frag;
    }

   public void testFragment() {
      FrameworkObjectsGeneratorFragment fragment = new FrameworkObjectsGeneratorFragment() {
         //Override methods and add assertations here.
      };

      Fragment frag = startFragment(fragment);
    }
  }

Метод startFragment() добавляет фрагмент, который вы указываете в ViewGroup в TestActivity.

Хорошая вещь о тестировании фрагментов, в отличие от действий, заключается в том, что вы можете расширить фрагмент, чтобы переопределить защищенные поля и методы, в которых вы можете добавлять утверждения.

ПРИМЕЧАНИЕ. Вызовите getSupportFragmentManager(), если вы используете библиотеку поддержки.