androidandroid-jetpack-composerobolectricinstrumented-testcomposable

How to assert next started activity for a composable test?


I have a composable with a button that launches one of the native activities (Google Settings). To test this before compose (using Robolectric) I would do something like this:

My test:

@Test
fun `MyFragment - when button clicked - starts activity`() {
    // ...
    val shadowActivity: ShadowActivity = Shadow.extract(activity)
    val nextStartedActivity = shadowActivity.nextStartedActivity
    assertNotNull(nextStartedActivity)
    assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, nextStartedActivity.action)
}

With compose tests (not using activity scenario) it's different. There is no activity handle, only a composeTestRule:

My test:

// ...

private val buttonNode get() = composeTestRule.onNodeWithContentDescription("Button")

@Test
fun `MyComposableToTest - when button clicked - starts activity`() {
    composeTestRule.setContent {
        MyComposableToTest()
    }

    buttonNode.assertExists().assertHasClickAction().assertIsEnabled().performClick()

    // No possibility to get current activity
}

How can I assert that a new activity is started when testing a Composable?

Some context:


Solution

  • You are able to fetch the context from the ComposeContentTestRule like this:

    lateinit var context : Context
    composeTestRule.setContent {
        context = LocalContext.current
        MyComposableToTest()
    }
    

    and then to assert the next started activity

    val shadowActivity: ShadowActivity = Shadow.extract(context as ComponentActivity)
    val nextStartedActivity = shadowActivity.nextStartedActivity
    assertEquals(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, nextStartedActivity.action)