Как преобразовать Android SingleLaunchActivityTestCase в ActivityTestRule?(Контрольно-измерительный прибор) - PullRequest
0 голосов
/ 21 сентября 2018

В документации для SingleLaunchActivityTestCase говорится, что этот класс устарел, и его следует заменить на ActivityTestRule.Но как это сделать?

SingleLaunchActivityTestCase разрешил запуск Activity один раз и оставил ее открытой;тогда в течение этого времени может быть запущено несколько тестов, затем действие будет закрыто.ActivityTestRule, похоже, не имеет этой функциональности - он всегда перезапускает Activity для каждого метода @Test.

Так можно ли заставить ActivityTestRule запустить Activity один раз и оставить его открытым, и как мне это сделать?убедитесь, что context (из activityTestRule.getActivity()) не является нулевым для каждой функции @Test?

Пример кода здесь .

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Я использовал ответ Джона Адамса, чтобы уточнить пример:

@RunWith(AndroidJUnit4.class)
@LargeTest
public class KeepActivityOpenDuringTests {

    @Rule
    public ActivityTestRule<MyActivity> activityTestRule =
            new ActivityTestRule<>(MyActivity.class, true, false);

    /**
     * When running the class as a test suite, setUp() is called repeatedly
     * for each test method. Use setupDone to prevent multiple setups.
     */
    private static boolean setupDone;
    // Static to persist across multiple tests
    private static Context context;
    private static MyActivity activityUnderTest;

    @Before
    public void setUp() throws Exception {
        // Launch the Activity manually, once, to get a real Context object.
        if (!setupDone) {
            activityUnderTest = activityTestRule.launchActivity(null);
            context = (Context) activityUnderTest;
            // continue setup of singletons...
            setupDone = true;
        }
    }

    @Test
    public void test1() {
        // Use context ...
    }

    @Test
    public void test2() {
       // Use activityUnderTest ...
    }

    @AfterClass
    public static void cleanUp() throws Exception {
        if (activityUnderTest != null) {
            activityUnderTest.finish();
            // Prevent any potential memory leaks
            activityUnderTest = null;
            context = null;
            setupDone = false;
        }
    }
}

Он работает как SingleLaunchActivityTestCase, когда тесты запускаются как класс или по отдельности.

0 голосов
/ 28 декабря 2018

Используйте конструктор , который не запускает действие по умолчанию (для аргумента launchActivity установлено значение false).Затем используйте launchActivity() в вашей настройке, но не в каждом методе тестирования.Таким образом, вы запустите его один раз, но каждый тест будет работать на одном и том же экземпляре.

Возможно, вы захотите явно завершить действие в конце класса теста для очистки.

Примечание. Обычно это не лучший способ тестирования, поскольку тесты могут зависеть друг от друга (что не очень хорошая идея) или давать неверные результаты в зависимости от порядка их выполнения и т. Д., Посколькув этом случае состояние активности сохраняется от одного теста к другому.

...