Есть ли способ приостановить и возобновить активность во время теста на эспрессо?

То, что я хочу сделать, очень просто, я просто хочу проверить свою логику IllegalState (во время фиксации фрагмента), стоящую за моими действиями. Я хочу приостановить действие, попытаться зафиксировать фрагмент, а затем утверждаю, что я обрабатываю это право.

Но, похоже, невозможно приостановить, а затем возобновить активность во время тестов эспрессо. Есть ли способ сделать это без запуска другого действия?


person Max Fratane    schedule 15.05.2020    source источник


Ответы (2)


Квинтин прав в своем ответе, чтобы указать вам на ActivityScenario.moveToState(newState:), но ему не хватает некоторых деталей, которые я надеюсь заполнить здесь.

Прежде всего, обратите внимание, что ActivityScenario.launch(activityClass:) не только запускает действие, но и ожидает завершения переходов состояния его жизненного цикла. Итак, если вы не вызываете Activity.finish() в методах событий жизненного цикла вашей активности вы можете предположить, что он находится в RESUMED на момент ActivityScenario.launch(activityClass:).

Во-вторых, как только ваша активность запущена и в RESUMED, а затем вернуть его в состояние STARTED. фактически приведет к тому, что метод вашей активности onPause() будет называется. Аналогично, возврат действия в состояние СОЗДАНО. , вызовет как его onPause(), так и onStop(), которые необходимо вызвать.

В-третьих, после того как вы вернули действие обратно в СОЗДАНО или STARTED, вы должны переместите его в состояние RESUMED, прежде чем вы сможете выполнять утверждения представления и действия над ним, иначе ваш тестовый метод выдаст NoActivityResumedException .

Все вышеперечисленное сводится к следующему методу испытаний:

@Test
fun moving_activity_back_to_started_state_and_then_forward_to_resumed_state() {
    val activityScenario = ActivityScenario.launch(MyActivity::class.java)

    // the activity's onCreate, onStart and onResume methods have been called at this point

    activityScenario.moveToState(Lifecycle.State.STARTED)

    // the activity's onPause method has been called at this point

    activityScenario.moveToState(Lifecycle.State.RESUMED)

    // the activity's onResume method has been called at this point
}

Чтобы увидеть это в действии, обратитесь к этому примеру приложения и этого тестового класса в частности.

person Adil Hussain    schedule 04.12.2020

Вы можете попробовать ActivityScenario, но они не включают Pause как государство. Вам может сойти с рук метод recreate(), но это приостановка и Возобновление.

    //possibly:
    // @get:Rule var activityScenarioRule = activityScenarioRule<MyActivity>()

    val scenario = ActivityScenario.launch(MyActivity::class.java)
    scenario.moveToState(Lifecycle.State.RESUMED)
    //...
    scenario.recreate()
    //...

Я бы предложил иметь некоторый интерфейс/абстрактный обработчик, который вы можете тестировать вне контекста Android.

person Quintin Balsdon    schedule 03.12.2020