Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState caused by launchFragmentInContainer

I am trying to test the app workflow. The navigation component has been used to define the app workflow. Have used FragmentScenario for testing the navigation from one fragment to another based on this reference(https://developer.android.com/guide/navigation/navigation-testing).

Have added the following dependency in build.gradle debugImplementation("androidx.fragment:fragment-testing:1.1.0-beta01") { exclude group: 'androidx.test', module: 'core' }

for accessing the api launchFragmentInContainer

Have used MockK for mocking the navController

Below is the sample snippet

@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)
    }
}

My expectation is to pass the test case but I am getting the following runtime error

 `java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState`
like image 201
Raghul Vaikundam Avatar asked Aug 04 '19 05:08

Raghul Vaikundam


1 Answers

Make sure the device you are running the tests on is unlocked. If the screen is off or at the lock screen you will get a stack trace that looks roughly like this:

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
like image 195
TrevJonez Avatar answered Nov 20 '22 07:11

TrevJonez