Android fragments java.lang.IllegalStateException:在由launchFragmentInContainer引起的onSaveInstanceState之后无法执行此操作
我正在尝试测试应用程序工作流。导航组件已用于定义应用程序工作流。已使用FragmentScenario基于此引用()测试从一个片段到另一个片段的导航 在build.gradle中添加了以下依赖项Android fragments java.lang.IllegalStateException:在由launchFragmentInContainer引起的onSaveInstanceState之后无法执行此操作,android-fragments,android-testing,android-architecture-components,android-architecture-navigation,Android Fragments,Android Testing,Android Architecture Components,Android Architecture Navigation,我正在尝试测试应用程序工作流。导航组件已用于定义应用程序工作流。已使用FragmentScenario基于此引用()测试从一个片段到另一个片段的导航 在build.gradle中添加了以下依赖项 debugImplementation(“androidx.fragment:fragment testing:1.1.0-beta01”){ 排除组:“androidx.test”,模块:“core” } 用于访问apilaunchFragmentInContainer 已使用Mock模拟导航控制器
debugImplementation(“androidx.fragment:fragment testing:1.1.0-beta01”){
排除组:“androidx.test”,模块:“core”
}
用于访问apilaunchFragmentInContainer
已使用Mock模拟导航控制器
下面是示例代码段
@RelaxedMockK
private lateinit var navController: NavController
@Before
fun setup() {
MockKAnnotations.init(this)
}
@Test
fun navigationToSecondFragmentTest() {
val secondFragmentScenario = launchFragmentInContainer<SecondFragment>()
secondFragmentScenario.onFragment {
Navigation.setViewNavController(it.requireView(), navController)
}
onView(ViewMatchers.withId(R.id.btn)).perform(ViewActions.click())
verify{
navController.navigate(R.id.secondFragment)
}
}
确保正在运行测试的设备已解锁。如果屏幕关闭或处于锁定屏幕,您将获得大致如下所示的堆栈跟踪:
java.lang.RuntimeException: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.test.runner.MonitoringInstrumentation.runOnMainSync(MonitoringInstrumentation.java:441)
at androidx.test.core.app.ActivityScenario.onActivity(ActivityScenario.java:564)
at androidx.fragment.app.testing.FragmentScenario.internalLaunch(FragmentScenario.java:300)
at androidx.fragment.app.testing.FragmentScenario.launchInContainer(FragmentScenario.java:282)
at com.foo.package.YourFragmentTest.yourTestFunction(YourFragmentTest.kt:xy)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
答案不正确,因为此测试未在物理设备上运行,所以活动和片段场景由构建环境计算机上的AndroidJUnit4测试运行程序运行。我希望这些场景将通过instrumentation runner和robolectric运行。在前一种情况下,锁定屏幕确实是一个合理且可能的原因
java.lang.RuntimeException: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at androidx.test.runner.MonitoringInstrumentation.runOnMainSync(MonitoringInstrumentation.java:441)
at androidx.test.core.app.ActivityScenario.onActivity(ActivityScenario.java:564)
at androidx.fragment.app.testing.FragmentScenario.internalLaunch(FragmentScenario.java:300)
at androidx.fragment.app.testing.FragmentScenario.launchInContainer(FragmentScenario.java:282)
at com.foo.package.YourFragmentTest.yourTestFunction(YourFragmentTest.kt:xy)
Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState