ndtp / android-testify

Add screenshots to your Android tests
Other
98 stars 5 forks source link

IllegalStateException: Given component holder class ComposableTestActivity does not implement interface GeneratedComponent #207

Open djette-st opened 4 months ago

djette-st commented 4 months ago

Describe the bug

When using HiltAndroidRule from Dagger/Hilt 2.49+ with Testify, an IllegalStateException is thrown.

@HiltAndroidTest
class NavigationTest {

    @get:Rule(order = 0)
    var hiltRule = HiltAndroidRule(this)

    @get:Rule(order = 1)
    val rule = ComposableScreenshotRule(composeTestRule = createAndroidComposeRule(ComposableTestActivity::class.java))

    @ScreenshotInstrumentation
    @Test
    fun default() {
      rule
          .setComposeActions { composeTestRule ->
              composeTestRule.setContent {
                MainNavigation()
              }
          }
          .assertSame()
    }
}

This issue relates to:

To Reproduce

Related issue in Dagger: https://github.com/google/dagger/issues/3394

java.lang.IllegalStateException: Given component holder class dev.testify.ComposableTestActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager
    at dagger.hilt.EntryPoints.get(EntryPoints.java:62)
    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.createInternal(HiltViewModelFactory.java:206)
    at dagger.hilt.android.internal.lifecycle.HiltViewModelFactory.createInternal(HiltViewModelFactory.java:200)
    at androidx.hilt.navigation.HiltViewModelFactory.create(HiltNavBackStackEntry.kt:77)
    at androidx.hilt.navigation.compose.HiltViewModelKt.createHiltViewModelFactory(HiltViewModel.kt:57)

Example workaround: https://github.com/android/nowinandroid/blob/main/ui-test-hilt-manifest/src/main/kotlin/com/google/samples/apps/nowinandroid/uitesthiltmanifest/HiltComponentActivity.kt

matteo-goghero-leitha commented 3 months ago

I have the same problem too, event the workaround doesn't work.

DanielJette commented 3 months ago

@matteo-goghero-leitha

The bug occurs in Testify because the ComposableTestActivity is automatically launched by the ComposableScreenshotRule

There's an extra step needed to work around this problem:

  1. There needs to be a subclass of ComposableTestActivity that implements ComponentActivity like in https://github.com/android/nowinandroid/blob/main/ui-test-hilt-manifest/src/main/kotlin/com/google/samples/apps/nowinandroid/uitesthiltmanifest/HiltComponentActivity.kt
  2. There also needs to be a subclass of ComposableScreenshotRule which uses the Activity created in the previous step.

So, for now, I think the only way around this in Testify 2.0 would be for you to duplicate the code in ComposableScreenshotRule and create your own version of it that uses a ComponentActivity instead of the hardcoded ComposableTestActivity.

Otherwise, this will have to be fixed in a future version of Testify.