ActivityInstrumentationTestCase2 vs ActivityTestRule

Мне нужно протестировать одно действие в моем приложении для Android. Документация ActivityInstrumentationTestCase2 гласит:

Этот класс обеспечивает функциональное тестирование одного действия.

И документация ActivityTestRule гласит:

Это правило обеспечивает функциональное тестирование одного действия.

Почти такие же слова. Помимо двух образцов, которые я закодировал, сделайте то же самое. Так что я должен предпочесть ActivityTestRule над ActivityInstrumentationTestCase2 или наоборот?

Я вижу, что расширение ActivityInstrumentationTestCase2 выглядит как тест в стиле JUnit3 (его предком является junit.framework.TestCase , а методы тестирования должны начинаться со junit.framework.TestCase test ).

Использование ActivityTestRule

 package sample.com.sample_project_2; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.LargeTest; import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.typeText; import static android.support.test.espresso.matcher.ViewMatchers.withId; @RunWith(AndroidJUnit4.class) @LargeTest public class ApplicationTest { @Rule public ActivityTestRule<SecAct> mActivityRule = new ActivityTestRule(SecAct.class); @Test public void foo() { onView(withId(R.id.editTextUserInput)).perform(typeText("SAMPLE")); } } 

Расширение ActivityInstrumentationTestCase2

 package sample.com.sample_project_2; import android.test.ActivityInstrumentationTestCase2; import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.typeText; import static android.support.test.espresso.matcher.ViewMatchers.withId; public class ApplicationTest2 extends ActivityInstrumentationTestCase2<SecAct> { public ApplicationTest2() { super(SecAct.class); } @Override protected void setUp() throws Exception { super.setUp(); getActivity(); } public void testFoo2() { onView(withId(R.id.editTextUserInput)).perform(typeText("SAMPLE 2")); } } 

Для вашего примера нет никакой разницы. Вы можете использовать любой из них.

В соответствии с принципом OO мы будем «Предпочитаем состав над наследованием». Использование ActivityTestRule<> осуществляется через композицию, в то время как ActivityInstrumentationTestCase2<> является наследованием.

Иногда я предпочитаю иметь общий базовый класс для своих тестовых классов для повторного использования общих инициализаций. Это помогает мне сгруппировать тесты в соответствии с темой. ActivityTestRule<> позволяет мне делать такие вещи.

По этим причинам я предпочитаю ActivityTestRule<> . В противном случае я не видел никакой разницы.