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