AndroidX.Test ActivityScenario: java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPED")
AndroidX.Test ActivityScenario: java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "STOPPED")
ActivityScenario is a replacement of ActivityController in Robolectric and ActivityTestRule in ATSL.
从 ATSL 重构到 AndroidX 测试时,我使用此代码在每次浓缩咖啡测试之前启动我的 IndexActivity。
@Before
public void launchActivity() {
ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class);
}
但是,我的测试有 80-90% 的时间停滞并抛出此错误。
java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "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.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.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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[=12=]0(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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[=12=]0(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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)
编辑:现在已在 https://github.com/android/android-test/issues/143
中修复
索赔:
Activity场景 API 的 launch(Intent startActivityIntent)
方法存在限制。它等待 Activity 变为 Lifecycle.STATE.RESUMED
或 DESTROYED
,如果它不在 4.5 秒内,则抛出此错误。
上下文:
我的应用程序使用 IndexActivity
加载配置,该配置指示应用程序进行某些 API 调用。但是,在加载 DialogActivity
并且 IndexActivity
立即进入 STOPPED
之后。在 DialogActivity
中接受条款后,IndexActivity
返回到 RESUMED
,然后 ActivityScenario 正常工作。在我的测试中,Espresso 是否可以在 4.5 秒内点击条款以使 IndexActivity
变为 RESUMED
或在此之前是否会抛出此错误存在竞争条件。需要进行重大重构才能使另一个 Activity 与 ActivityScenario 一起启动,因此这不是一个选项。
修复
在 Activity 场景的 public static <A extends Activity> ActivityScenario<A> launch(Intent startActivityIntent)
中,检查逻辑 scenario.waitForActivityToBecomeAnyOf(State.RESUMED, State.DESTROYED);
如果您可以创建自己的自定义 Activity 场景并将这行代码调整为 scenario.waitForActivityToBecomeAnyOf(State.STOPPED, State.DESTROYED);
之类的代码,那么理论上它会适合您。然后您可以再次使用 ActivityScenario 将 Activity 移动到您想要的任何生命周期状态。
或 只需使用旧的 https://developer.android.com/reference/androidx/test/rule/ActivityTestRule 直到 Google 在 AndroidX 测试中解决此问题。
TL;DR
发生这种情况是因为 Activity 的 Lifecycle.State 不是 ActivityScenario.Launch()
等待的两个特定生命周期状态,RESUMED
或 DESTROYED
。您的 activity 可能处于对话框的背景或创建 API.
时未考虑的其他极端情况
郑重声明,这将在即将发布的版本中修复。
https://github.com/android/android-test/issues/143
对我来说,这是因为我插入了一个屏幕关闭的设备和一个模拟器 运行。我以为我正在启动模拟器,但我在设备上 运行 它。由于屏幕关闭,测试无法转换到有效状态。
ActivityScenario is a replacement of ActivityController in Robolectric and ActivityTestRule in ATSL.
从 ATSL 重构到 AndroidX 测试时,我使用此代码在每次浓缩咖啡测试之前启动我的 IndexActivity。
@Before
public void launchActivity() {
ActivityScenario<IndexActivity> scenario = ActivityScenario.launch(IndexActivity.class);
}
但是,我的测试有 80-90% 的时间停滞并抛出此错误。
java.lang.AssertionError: Activity never becomes requested state "[RESUMED]" (last lifecycle transition = "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.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.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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[=12=]0(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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.run(ParentRunner.java:290)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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[=12=]0(ParentRunner.java:58)
10:54:42 V/InstrumentationResultParser: at org.junit.runners.ParentRunner.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)
编辑:现在已在 https://github.com/android/android-test/issues/143
中修复索赔:
Activity场景 API 的 launch(Intent startActivityIntent)
方法存在限制。它等待 Activity 变为 Lifecycle.STATE.RESUMED
或 DESTROYED
,如果它不在 4.5 秒内,则抛出此错误。
上下文:
我的应用程序使用 IndexActivity
加载配置,该配置指示应用程序进行某些 API 调用。但是,在加载 DialogActivity
并且 IndexActivity
立即进入 STOPPED
之后。在 DialogActivity
中接受条款后,IndexActivity
返回到 RESUMED
,然后 ActivityScenario 正常工作。在我的测试中,Espresso 是否可以在 4.5 秒内点击条款以使 IndexActivity
变为 RESUMED
或在此之前是否会抛出此错误存在竞争条件。需要进行重大重构才能使另一个 Activity 与 ActivityScenario 一起启动,因此这不是一个选项。
修复
在 Activity 场景的 public static <A extends Activity> ActivityScenario<A> launch(Intent startActivityIntent)
中,检查逻辑 scenario.waitForActivityToBecomeAnyOf(State.RESUMED, State.DESTROYED);
如果您可以创建自己的自定义 Activity 场景并将这行代码调整为 scenario.waitForActivityToBecomeAnyOf(State.STOPPED, State.DESTROYED);
之类的代码,那么理论上它会适合您。然后您可以再次使用 ActivityScenario 将 Activity 移动到您想要的任何生命周期状态。
或 只需使用旧的 https://developer.android.com/reference/androidx/test/rule/ActivityTestRule 直到 Google 在 AndroidX 测试中解决此问题。
TL;DR
发生这种情况是因为 Activity 的 Lifecycle.State 不是 ActivityScenario.Launch()
等待的两个特定生命周期状态,RESUMED
或 DESTROYED
。您的 activity 可能处于对话框的背景或创建 API.
郑重声明,这将在即将发布的版本中修复。 https://github.com/android/android-test/issues/143
对我来说,这是因为我插入了一个屏幕关闭的设备和一个模拟器 运行。我以为我正在启动模拟器,但我在设备上 运行 它。由于屏幕关闭,测试无法转换到有效状态。