AndroidX.Test ActivityScenario: java.lang.AssertionError: активность никогда не становится запрошенным состоянием "[RESUMED]" (последний переход жизненного цикла = "STOPPED") - PullRequest
0 голосов
/ 03 декабря 2018

ActivityScenario - это замена ActivityController в Robolectric и ActivityTestRule в ATSL.

При рефакторинге из ATSL в тест AndroidX я использую этот код для запуска IndexActivity перед каждым тестом эспрессо.

    @Before
public void launchActivity() {
    ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class);
}

Однако мои тесты останавливаются 80-90% времени и выдают эту ошибку.

java.lang.AssertionError: Деятельность никогда не становится запрошенным состоянием "[RESUMED] "(последний переход жизненного цикла =" STOPPED ")

При попытке устранения неполадок я изменил приведенное выше значение на:

@Before
public void launchActivity() {
    ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class);
    scenario.moveToState(Lifecycle.State.RESUMED);
}

Однако сейчас я получаю ту же ошибку100% времени.

Следуя документации, я не уверен, почему это происходит.

Я использую AndroidX Test Orchestrator и тестирую на эмуляторе с Api 28

Полная версия StackTrace для теста здесь:

10:54:42 V/InstrumentationResultParser: java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPED")
10:54:42 V/InstrumentationResultParser: at androidx.test.core.app.ActivityScenario.waitForActivityToBecomeAnyOf(ActivityScenario.java:228)
10:54:42 V/InstrumentationResultParser: at androidx.test.core.app.ActivityScenario.moveToState(ActivityScenario.java:368)
10:54:42 V/InstrumentationResultParser: at com.myapplication.android.test.HomeTest.launchActivity(HomeTest.java:30)
10:54:42 V/InstrumentationResultParser: at java.lang.reflect.Method.invoke(Native Method)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
10:54:42 V/InstrumentationResultParser: at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
10:54:42 V/InstrumentationResultParser: at androidx.test.internal.runner.junit4.statement.RunBefores.evaluate(RunBefores.java:76)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
10:54:42 V/InstrumentationResultParser: at androidx.test.ext.junit.runners.AndroidJUnit4.run(AndroidJUnit4.java:104)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.Suite.runChild(Suite.java:128)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.Suite.runChild(Suite.java:27)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
10:54:42 V/InstrumentationResultParser: at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
10:54:42 V/InstrumentationResultParser: at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
10:54:42 V/InstrumentationResultParser: at androidx.test.internal.runner.TestExecutor.execute(TestExecutor.java:56)
10:54:42 V/InstrumentationResultParser: at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:388)
10:54:42 V/InstrumentationResultParser: at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2075)

Ответы [ 2 ]

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

Для записи, это будет исправлено в следующем выпуске.https://github.com/android/android-test/issues/143

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

Заявка: В методе launch(Intent startActivityIntent) API ActivityScenario есть ограничение.Он ожидает, когда активность будет Lifecycle.STATE.RESUMED или DESTROYED, и если это не произойдет в течение 4,5 секунд, он выдаст эту ошибку.

Контекст: Мое приложение использует IndexActivityзагрузить конфигурацию, которая инструктирует приложение на определенные вызовы API, чтобы сделать.Однако сразу после загрузки DialogActivity и IndexActivity переходит в STOPPED.При принятии условий в DialogActivity IndexActivity возвращается в RESUMED, и затем ActivityScenario работает правильно.С моими тестами было условие гонки на то, может ли Espresso щелкнуть по терминам в течение 4,5 секунд, чтобы получить IndexActivity равным RESUMED, или эта ошибка будет выдана до этого.Потребуется серьезный рефакторинг, чтобы разрешить запуск другого действия с ActivityScenario, чтобы это было невозможно.

Исправление В public static <A extends Activity> ActivityScenario<A> launch(Intent startActivityIntent) сценария активности, проверьте логику scenario.waitForActivityToBecomeAnyOf(State.RESUMED, State.DESTROYED);

Если вы можете создать свой собственный сценарий активности и настроить эту строку кода на что-то вроде scenario.waitForActivityToBecomeAnyOf(State.STOPPED, State.DESTROYED);, то это теоретически будет работать для вас.Затем вы можете снова использовать ActivityScenario, чтобы перевести Activity в любое желаемое состояние жизненного цикла.

ИЛИ просто используйте старый https://developer.android.com/reference/androidx/test/rule/ActivityTestRule, пока Google не решит эту проблему в тесте AndroidX.

TL; DR Это происходит потому, что в Lifecycle.State вашей активности нет ни одного из двух состояний жизненного цикла, ожидаемых ActivityScenario.Launch(), RESUMED или DESTROYED.Вероятно, ваша деятельность связана с диалогом или другой ситуацией, о которой не задумывались при создании API.

...