Tentando realizar os testes em containers como demonstrado em aula, os testes falham sempre que passam (ou tentam) pelo Redis.
Algumas informações sobre o erro:
Resolved Exception: Type = org.springframework.data.redis.RedisConnectionFailureException"
e a mensagem de retorno no body:
Body = {"timeStamp":"2023-09-12T18:01:07.0316679","status":500,"error":"**INTERNAL_SERVER_ERROR","message":"Unable to connect to Redis","path":""**}
Sobre a classe de teste, segue abaixo o essencial:
@AutoConfigureMockMvc
class TopicoControllerTest(
@Autowired private val mockMvc: MockMvc,
@Autowired private val tokenService: TokenService,
) : DatabaseContainerConfiguration() {
private var token: String? = null
companion object {
private const val URI = "/topicos"
}
@BeforeEach
fun setup() {
token = gerarToken()
}
@Test
@DisplayName("Deve retornar 200 quando chamar /topicos com token válido e role valida")
fun listar1() {
mockMvc.get(URI) {
headers { token?.let { setBearerAuth(it) } }
}
.andExpect { status { isOk() } }
}
private fun gerarToken(): String {
val usuario = UsuarioTest.buildToToken() // este usuario tem os mesmos dados do registrado no banco.
return tokenService.generateToken(usuario.email)
}
}
e a classe de configuração dos containers:
@Testcontainers
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
abstract class DatabaseContainerConfiguration {
companion object {
@Container
private val mySQLContainer = MySQLContainer<Nothing>("mysql:8.0").apply {
withExposedPorts(3306)
withDatabaseName("testeDB")
withUsername("teste")
withPassword("13456")
withReuse(true)
}
@Container
val rediscontainer = GenericContainer<Nothing>("redis:latest").apply {
withExposedPorts(6379)
dependsOn(mySQLContainer)
}
@JvmStatic
@DynamicPropertySource
fun properties(registry: DynamicPropertyRegistry) {
registry.add("spring.datasource.url", mySQLContainer::getJdbcUrl)
registry.add("spring.datasource.username", mySQLContainer::getUsername)
registry.add("spring.datasource.password", mySQLContainer::getPassword)
registry.add("spring.redis.host", rediscontainer::getHost)
registry.add("spring.redis.port", rediscontainer::getFirstMappedPort)
}
}
}
Pelo observado, creio que os testes automatizados não estão conseguindo conectar ao cache do Redis. Porém, ao executar manualmente e testar via Postman, tudo funciona.