2
respostas

Erro ao executar os testes da classe TopicoRepositoryTest: topicoRepository não foi inicializado

Após seguir o passo a passo mostrado na aula, ao executar os testes de unidades da classe TopicoRepositoryTest, estava apresentando o seguinte erro:

kotlin.UninitializedPropertyAccessException: lateinit property topicoRepository has not been initialized

Após pesquisar exemplos de códigos com Testcontainers, descobri que para que o atributo mysqlContainer seja utilizado para a criação de um container Docker, é necessário adicionar nele as anotações @JvmField e @ClassRule.

E para que o Spring possa inicializar o atributo topicoRepository, é necessário colocar a anotação @RunWith(SpringRunner::class) na classe TopicoRepositoryTest.

O meu código ficou da seguinte forma:

TopicoRepositoryTest.kt:

...
@DataJpaTest
@Testcontainers
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@RunWith(SpringRunner::class)
class TopicoRepositoryTest {

    private val topico = TopicoTest.build()

    companion object {

        @JvmField
        @Container
        @ClassRule
        val mysqlContainer = MySQLContainer<Nothing>("mysql:9.1.0").apply{
            withDatabaseName("testedb")
            withUsername("myuser")
            withPassword("secret")
        }

        @JvmStatic
        @DynamicPropertySource
        fun properties(registry: DynamicPropertyRegistry) {
            registry.add("spring.datasource.url", mysqlContainer::getJdbcUrl)
            registry.add("spring.datasource.password", mysqlContainer::getPassword)
            registry.add("spring.datasource.username", mysqlContainer::getUsername)
            registry.add("spring.datasource.driverClassName", mysqlContainer::getDriverClassName)
        }
    }

    @Autowired
    private lateinit var topicoRepository: TopicoRepository

    @Test
    fun `deve gerar um relatorio`() {
       ...
    }

    @Test
    fun `deve listar topico pelo nome do curso`() {
        ...
    }
}
2 respostas

Olá Henrique! Tudo bem?

O erro UninitializedPropertyAccessException indica que a propriedade topicoRepository não foi inicializada antes de ser usada.

Pelo seu código, parece que você já está no caminho certo ao usar @Autowired para injetar topicoRepository. No entanto, há algumas coisas que você pode verificar ou ajustar:

  1. Anotações de Teste: Certifique-se de que está usando a anotação correta para rodar seus testes com o Spring. Em vez de @RunWith(SpringRunner::class), que é usado em testes JUnit 4, você deve usar @ExtendWith(SpringExtension::class) se estiver usando JUnit 5.

  2. Configuração de Teste: Verifique se todas as configurações necessárias para o Spring inicializar o contexto estão corretas. Como você está usando @DataJpaTest, isso deve configurar o contexto do Spring para testes de JPA, mas vale a pena garantir que todas as dependências e configurações estão corretas.

  3. Verifique o Container: Como você está usando Testcontainers, certifique-se de que o container MySQL está sendo inicializado corretamente e que as propriedades dinâmicas estão sendo aplicadas.

Espero que uma dessas sugestões ajude a resolver o problema que você está enfrentando.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.

Adicione a anotação @Autowired na variável:

@Autowired
private lateinit var topicoRepository: TopicoRepository