Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Dúvida] Criar teste um URLs com parâmetros

Olá a todos,

Estou tentando entender melhor essa parte de testes, e me deparei com alguns problemas. Estou atualmente tentando implementar os testes para os métodos de Delete e Update nos controllers. No entanto, estou com dúvidas sobre como realizar os testes quando o método requer um ID. Como vocês recomendam abordar essa situação? Abaixo segue forma que estou tentando seguir.

@DeleteMapping("/{id}")
    public ResponseEntity<Void> delete(@PathVariable Long id){
        service.delete(id);
        return ResponseEntity.noContent().build();
    }
    @Test
    @DisplayName("Deveria retornar http 404 caso não encontre o ID")
    void delete() throws Exception {
        Long id = 2L;
        var response = mvc.perform(delete("/medicos/{id}", id))
                .andReturn().getResponse();

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

Oi!

Você precisa configurar o mock (service) para cada cenário. Por exemplo:

@Test
@DisplayName("Deveria retornar http 404 caso não encontre o ID")
void deleteComIdInvalido() throws Exception {
    Long id = 2L;
    
    //simulando que o id nao existe
    given(service.delete(id)).willThrow(EntityNotFoundException.class);
    
    var response = mvc.perform(delete("/medicos/{id}", id)).andReturn().getResponse();

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

@Test
@DisplayName("Deveria retornar http 204 caso encontre o ID")
void deleteComIdValido() throws Exception {
    Long id = 2L;
    
    var response = mvc.perform(delete("/medicos/{id}", id)).andReturn().getResponse();

    assertThat(response.getStatus()).isEqualTo(HttpStatus.NO_CONTENT.value());
}
solução!

Usei uma abordagem um pouco diferente pois não consegui utilizar o given sem que apresentasse erro. Ficou da seguinte forma:

 @Test
    @DisplayName("Deveria retornar http 404 caso não encontre o ID")
    void deleteComIdInvalido() throws Exception {
        Long id = 19L;

        doThrow(new EntityNotFoundException()).when(service).delete(id);

        var response = mvc.perform(delete("/medicos/{id}", id)).andReturn().getResponse();
        assertThat(response.getStatus()).isEqualTo(HttpStatus.NOT_FOUND.value());
    }
@Test
    @DisplayName("Deveria retornar http 203 caso o ID for encontrado")
    void deleteComIdValido() throws Exception {
        Long id = 2L;

        var response = mvc.perform(delete("/medicos/{id}", id)).andReturn().getResponse();

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

A forma que utilizei é correta?