2
respostas

Problema com redis no docker.

Estou tendo o seguinte problema: Quando rodo a aplicação localmente, tudo funciona. Porém, quando rodo o teste, os métodos que interagem com o redis não funcionam. parece que não estão conseguindo se comunicar com o container criado no teste. se eu deixo o redis que uso em desenvolvimento ativo, os métodos funcionam. o que pode ser? parece que não está trocando o endereço nas properties durante os testes.

Classe Rating Controller test:

@Testcontainers @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class RatingControllerTest : DatabaseContainerConfiguration() {

@Autowired
private lateinit var webApplicationContext: WebApplicationContext

private lateinit var mockMvc: MockMvc

private var token: String? = null

@Autowired
private lateinit var jwtUtil: JWTUtil

companion object {
    private const val END_POINT_RATING = "/rating"
    private const val END_POINT_RATING_ID = END_POINT_RATING.plus("/%s")
}

@BeforeEach
fun setup() {

    token = generateTokenForTest()

    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext)
        .apply<DefaultMockMvcBuilder?>(
            SecurityMockMvcConfigurers.springSecurity()
        ).build()
}

@Test
fun `should return code 200 when rating is found`() {
    mockMvc.get(END_POINT_RATING_ID.format(1)).andExpect { status { is2xxSuccessful() } }
}


@Test
fun `teste df fdsf `() {
    mockMvc.get(END_POINT_RATING).andExpect { status { is2xxSuccessful() } }
}


@Test
fun `should return code 400 when request without token`() {
    mockMvc.delete(END_POINT_RATING_ID.format(1)).andExpect { status { is4xxClientError() } }
}

@Test
fun `should return code 400 when rating not found`() {
    mockMvc.get(END_POINT_RATING_ID.format(99)).andExpect { status { is4xxClientError() } }
}


@Test
fun `should return code 200 when correct token`() {
    mockMvc.delete("/rating/1") {
        headers { token?.let { this.setBearerAuth(it) } }
    }.andExpect { status { is2xxSuccessful() } }
}


private fun generateTokenForTest(): String? {
    val authorities = mutableListOf(br.com.leonardo.dicionarioAPI.model.Role(id = 1, "READ_WRITE"))
    return jwtUtil.generateToken("leonardo_spring_boot@gmail.com", authorities = authorities)
}

}

Arquivo application: spring.jpa.hibernate.ddl-auto=update spring.datasource.url=jdbc:mysql://localhost:3306/dictionary_api_database spring.datasource.username=spring_boot spring.datasource.password=Leonardodev@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.jpa.show-sql = true

spring.cache.type=redis spring.redis.host=localhost spring.redis.port=6379

spring.mail.host=sandbox.smtp.mailtrap.io spring.mail.port=2525 spring.mail.username=fcf96dc63ef45f spring.mail.password=4791b5e2b9a482 spring.mail.properties.mail.transport.protocol=smtp spring.mail.properties.mail.debug=true spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.transport.smtp.starttls.enable=true

jwt.secret = secret

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2 respostas

Olá, Leonardo

Pelo que você descreveu, parece que o seu ambiente de testes não está conseguindo se conectar ao Redis. Isso pode estar acontecendo porque o endereço do Redis não está sendo corretamente configurado nos testes.

Uma possibilidade é que você esteja usando o mesmo arquivo de propriedades para os ambientes de desenvolvimento e teste. Se esse for o caso, quando você roda os testes, o endereço do Redis aponta para o mesmo local que você usa em desenvolvimento.

Para resolver isso, você pode criar um arquivo de propriedades específico para os testes, onde o endereço do Redis aponte para o container que você está usando nos testes. Você pode criar um arquivo chamado application-test.properties na pasta src/test/resources. Dentro desse arquivo, você deve configurar o endereço do Redis para apontar para o container de teste.

Por exemplo:

spring.redis.host=testcontainer
spring.redis.port=6379

Depois, você precisa dizer ao Spring para usar esse arquivo quando estiver rodando os testes. Você pode fazer isso adicionando a anotação @TestPropertySource na sua classe de teste, assim:

@Testcontainers
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestPropertySource(locations = ["classpath:application-test.properties"])
class RatingControllerTest : DatabaseContainerConfiguration()  {
  //...
}

Com isso, o Spring deve usar o arquivo application-test.properties quando estiver rodando os testes, e o endereço do Redis deve apontar para o container de teste.

Espero ter ajudado e bons estudos!

Mesmo assim não foi...

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software