1
resposta

[Dúvida] Como criar testes em uma rota que exige path variables ?

OBS: Em uma requisição normal, passando o mesmo id que não existe, consigo obter o resultado experado (404)

![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

Controller

    @GetMapping("/{id}")
    public ResponseEntity detalhar(@PathVariable Long id){
        return service.detalhar(id);
    }

Service

    public ResponseEntity detalhar(Long id){
        var video = repository.getReferenceById(id);
        return ResponseEntity.ok(new DadosDetalhamentoVideo(video));
    }

Controller Advice

    @ExceptionHandler(EntityNotFoundException.class)
    public ResponseEntity tratarErro404(){
        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Recurso não encontrado");
    }

Case Test

    @Test
    @DisplayName("DEVE RETORNAR CÓDIGO 400 QUANDO FOR PASSADO UM ID E ELE NÃO EXISTIR")
    void detalharVideoCenario2() throws Exception{

        var response = mvc.perform(
                MockMvcRequestBuilders.get("/videos").param("id", "1010")
        ).andReturn().getResponse();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
    }

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

1 resposta

Olá João, tudo bem?

Pelo código que você compartilhou, acredito que a melhor forma de fazer isso é utilizando a classe MockMvc do Spring. Essa classe permite simular requisições HTTP e testar o comportamento da sua aplicação.

No seu caso, você pode fazer algo assim:

    @Test
    @DisplayName("DEVE RETORNAR CÓDIGO 400 QUANDO FOR PASSADO UM ID E ELE NÃO EXISTIR")
    void detalharVideoCenario2() throws Exception{

        var response = mvc.perform(
                MockMvcRequestBuilders.get("/videos/{id}", "1010")
                .contentType(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON))
                .andReturn().getResponse();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
    }

Dessa forma, você está simulando uma requisição GET para a rota /videos/{id} passando o valor 1010 como path variable. Em seguida, você verifica se a resposta tem o status code esperado (404).

Espero ter ajudado e bons estudos!