Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Dúvida] java.lang.IllegalStateException: Given component holder class androidx.activity.ComponentActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager

Bom dia a todos

Eu estou fazendo um projeto, e neste momento tentei utilizar o navigation test para fazer os testes de UI. Só que meu app também tem o Hilt e eu tive que configurar ambos para rodar os testes.

Ao fazer os testes, tive uma série de problemas, e acabei emperrando neste aqui:

java.lang.IllegalStateException: Given component holder class androidx.activity.ComponentActivity does not implement interface dagger.hilt.internal.GeneratedComponent or interface dagger.hilt.internal.GeneratedComponentManager
//resto do erro oculto
at br.com.alura.mundobola.MainActivityKt.TelaApp(MainActivity.kt:149)
at br.com.alura.mundobola.auxiliardoteste.PreparacaoDosTestesKt.preparacaoDosTestes(PreparacaoDosTestes.kt:15)
at br.com.alura.mundobola.ui.screen.CadastroDeBolasScreenKtTest$preparaNavHostController$1.invoke(CadastroDeBolasScreenKtTest.kt:34)
at br.com.alura.mundobola.ui.screen.CadastroDeBolasScreenKtTest$preparaNavHostController$1.invoke(CadastroDeBolasScreenKtTest.kt:33)

Esse erro em questão nao roda o composable da tela do app no teste. O código está assim:

@HiltAndroidTest
class CadastroDeBolasScreenKtTest{
    @get:Rule(order = 0)
    val hiltRule = HiltAndroidRule(this)
    @get:Rule(order = 1)
    val testeDoNavigation = createComposeRule()
    private lateinit var navController: NavHostController
    @Before
    fun preparaNavHostController(){
        testeDoNavigation.setContent {
            navController = preparacaoDosTestes()
            hiltRule.inject()
        }
    }
    @Test
    fun deveMostrarFabENomeApp_QuandoEstiverNaTelaDeBolas(){
        testeDoNavigation.verificaSeMostraOComponentPeloTexto(tituloTelaLista)
        testeDoNavigation.verificaSeNaoMostraOComponentPeloTexto(tituloTelaCadastro)
        testeDoNavigation.verificaSeNaoMostraOComponentPeloTexto(tituloTelaDetalhes)
        testeDoNavigation.verificaSeMostraOComponentePelaDescricao(iconeFABDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeBuscaDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeDeletarDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeEdicaoDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeVoltarDescricao)
    }
}

função preparacaoDosTestes(), que roda o composable da tela:

@Composable
fun preparacaoDosTestes(): TestNavHostController {
    val navController = TestNavHostController(context = LocalContext.current)
    navController.navigatorProvider.addNavigator(ComposeNavigator())
    TelaApp(navController)
    return navController
}

Encontrei no fórum alguns fórum, como este e outro, falando sobre um problema de compatibilidade de versão do navigation com o hilt, tentei mudar as versões e mesmo assim não funcionou.

meu build.gradle(app):

//só deixei o essencial do build.gradle
android {
    defaultConfig {
        testInstrumentationRunner = "br.com.alura.mundobola.ConfiguradorTesteHilt"
    }
}

dependencies {
    val navigationVersion = "2.7.3"
    // https://mvnrepository.com/artifact/androidx.navigation/navigation-compose
    implementation ("androidx.navigation:navigation-compose:$navigationVersion")
    // https://mvnrepository.com/artifact/androidx.datastore/datastore-preferences
    implementation ("androidx.datastore:datastore-preferences:1.0.0")
    // https://mvnrepository.com/artifact/androidx.navigation/navigation-testing
    androidTestImplementation ("androidx.navigation:navigation-testing:$navigationVersion")
    val hiltVersion = "2.48"
    implementation ("com.google.dagger:hilt-android:$hiltVersion")
    kapt("com.google.dagger:hilt-compiler:$hiltVersion")
    implementation ("androidx.hilt:hilt-navigation-compose:1.1.0")
    androidTestImplementation("com.google.dagger:hilt-android-testing:$hiltVersion")
    kaptAndroidTest("com.google.dagger:hilt-android-compiler:$hiltVersion")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
    androidTestImplementation("androidx.compose.ui:ui-test-junit4")
}

Como eu posso corrigir esse erro? e no meu caso, é mesmo a incompatibilidade de versão de ambos as bibliotecas?

Ps: meu projeto no github para dar uma olhada melhor no problema

3 respostas

Olá, Murilo! Bom dia!

O erro que você está enfrentando indica que a classe ComponentActivity não implementa a interface GeneratedComponent ou GeneratedComponentManager. Esse problema geralmente ocorre quando há uma incompatibilidade de versões entre as bibliotecas do Navigation e do Hilt.

No seu caso, você está utilizando a versão 2.7.3 do Navigation e a versão 2.48 do Hilt. Essas versões podem não ser compatíveis entre si, o que pode causar o erro que você está enfrentando.

Uma possível solução é tentar utilizar versões mais recentes das bibliotecas, que possam ser compatíveis entre si. Você pode verificar as versões mais recentes do Navigation e do Hilt e atualizar as dependências no seu arquivo build.gradle(app).

Além disso, é importante garantir que todas as dependências estejam corretamente configuradas. Verifique se você adicionou todas as dependências necessárias para o Hilt e para o Navigation, incluindo as dependências de teste.

Caso a atualização das versões não resolva o problema, você pode tentar pesquisar por problemas semelhantes em fóruns e repositórios de problemas do GitHub relacionados ao Navigation e ao Hilt. Esses recursos podem fornecer informações adicionais sobre possíveis soluções ou workarounds.

Espero ter ajudado e bons estudos!

Entao, eu tentei ir de todas as ultimas versões do Hilt, 2.47,2.48,2.48.1. Do navigation 2.7.0,2.7.1,2.7.2,2.7.3,2.7.4,2.7.5 indo de 1 por um e ainda não está dando certo. Já tentei rodar em emuladores diferentes, no meu celular, rebuildar o projeto e nada, eu ja tinha conferido para ver se eu configurei ambos certo ou não.

Deve estar acontecendo outro tipo de erro, ou eu não encontrei a versão ideal.

Eu já tentei criar um post no stack overflow, mas não tive resposta por enquanto. Se tiver um site de fórum que seja mais ideal para o ambiente android, agradeceria a sugestão

solução!

Descobri o meu erro

Era para ter implementado o ComposeRule de um jeito difentente, ao invés de criar o compose rule e depois inserir o conteúdo do navigation e a minha tela, eu deveria ter implementado o Compose Rule com a main activity:

@HiltAndroidTest
class CadastroDeBolasScreenKtTest{
    @get:Rule(order = 0)
    val hiltRule = HiltAndroidRule(this)
    @get:Rule(order = 1)
    //implementei a main activity direto no compose rule
    val testeDoNavigation = createAndroidComposeRule(MainActivity::class.java)
    @Test
    fun deveMostrarFabENomeApp_QuandoEstiverNaTelaDeBolas(){
        testeDoNavigation.verificaSeMostraOComponentPeloTexto(tituloTelaLista)
        testeDoNavigation.verificaSeNaoMostraOComponentPeloTexto(tituloTelaCadastro)
        testeDoNavigation.verificaSeNaoMostraOComponentPeloTexto(tituloTelaDetalhes)
        testeDoNavigation.verificaSeMostraOComponentePelaDescricao(iconeFABDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeBuscaDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeDeletarDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeEdicaoDescricao)
        testeDoNavigation.verificaSeNaoMostraOComponentePelaDescricao(iconeVoltarDescricao)
    }

}