0
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`() {
        ...
    }
}