Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Bug] Erro no id

Erro:

MockHttpServletResponse:
           Status = 201
    Error message = null

org.opentest4j.AssertionFailedError: 
expected: "{"id":null,"nome":"Samanta","email":"samanta.med@gmail.com","crm":"159357","telefone":"852316497","especialidade":"CARDIOLOGIA","endereco":{"logradouro":"rua xpto","bairro":"bairro","cep":"00000000","cidade":"Brasilia","uf":"DF","numero":null,"complemento":null}}"
 but was: "{"id":21,"nome":"Samanta","email":"samanta.med@gmail.com","crm":"159357","telefone":"852316497","especialidade":"CARDIOLOGIA","endereco":{"logradouro":"rua xpto","bairro":"bairro","cep":"00000000","cidade":"Brasilia","uf":"DF","numero":null,"complemento":null}}"
Expected :"{"id":null,"nome":"Samanta","email":"samanta.med@gmail.com","crm":"159357","telefone":"852316497","especialidade":"CARDIOLOGIA","endereco":{"logradouro":"rua xpto","bairro":"bairro","cep":"00000000","cidade":"Brasilia","uf":"DF","numero":null,"compl ...

Actual   :"{"id":21,"nome":"Samanta","email":"samanta.med@gmail.com","crm":"159357","telefone":"852316497","especialidade":"CARDIOLOGIA","endereco":{"logradouro":"rua xpto","bairro":"bairro","cep":"00000000","cidade":"Brasilia","uf":"DF","numero":null,"complem ...

<Click to see difference>

MedicoController:

@RestController
@RequestMapping("medicos")
@SecurityRequirement(name = "bearer-key")
public class MedicoController {

    @Autowired
    private MedicoRepository repository;

    @PostMapping
    @Transactional
    public ResponseEntity cadastrar(@RequestBody @Valid DadosCadastroMedico dados, UriComponentsBuilder uriBuilder) {
        var medico = new Medico(dados);
        repository.save(medico);
        var uri = uriBuilder.path("/medicos/{id}").buildAndExpand(medico.getId()).toUri();
        return ResponseEntity.created(uri).body(new DadosDetalhamentoMedico(medico));
    }

DadosCadastroMedico:

public record DadosCadastroMedico(
        @NotBlank
        String nome,
        @NotBlank @Email
        String email,
        @NotBlank @Pattern(regexp = "\\d{4,6}")
        String crm,
        @NotBlank
        String telefone,
        @NotNull
        Especialidade especialidade,
        @NotNull @Valid
        DadosEndereco endereco) {
}

DadosDetalhamentoMedico:

public record DadosDetalhamentoMedico(
        Long id,
        String nome,
        String email,
        String crm,
        String telefone,
        Especialidade especialidade,
        Endereco endereco) {

    public DadosDetalhamentoMedico(Medico medico) {
        this(
                medico.getId(),
                medico.getNome(),
                medico.getEmail(),
                medico.getCrm(),
                medico.getTelefone(),
                medico.getEspecialidade(),
                medico.getEndereco());
    }
}

teste:

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
class MedicoControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private JacksonTester<DadosCadastroMedico> dadosCadastroMedico;

    @Autowired
    private JacksonTester<DadosDetalhamentoMedico> dadosDetalhamentoMedico;

    @Test
    @WithMockUser
    @DisplayName("Deveria retornar 201, quando as informações de cadastro estiverm válidas")
    void cadastrar_cenario1() throws Exception {
        var especialidade = Especialidade.CARDIOLOGIA;
        var detalhamentoMedico = new DadosDetalhamentoMedico(null, "Samanta", "samanta.med@gmail.com", "159357", "852316497", especialidade, endereco());

        var response = mvc.perform(post("/medicos")
                .contentType(MediaType.APPLICATION_JSON)
            .content(dadosCadastroMedico.write(new DadosCadastroMedico("Samanta", "samanta.med@gmail.com", "159357", "852316497", especialidade, dadosEndereco()))
                    .getJson())).andReturn().getResponse();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());

        var jsonEsperado = dadosDetalhamentoMedico.write(detalhamentoMedico).getJson();

        assertThat(response.getContentAsString()).isEqualTo(jsonEsperado);
    }

    private DadosEndereco dadosEndereco() {
        return new DadosEndereco(
                "rua xpto",
                "bairro",
                "00000000",
                "Brasilia",
                "DF",
                null,
                null
        );
    }

    private Endereco endereco() {
        return new Endereco(
                "rua xpto",
                "bairro",
                "00000000",
                "Brasilia",
                "DF",
                null,
                null
        );
    }
}
1 resposta
solução!

Solução:

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
class MedicoControllerTest {

    @Autowired
    private MockMvc mvc;

    @Autowired
    private JacksonTester<DadosCadastroMedico> dadosCadastroMedico;

    @Autowired
    private JacksonTester<DadosDetalhamentoMedico> dadosDetalhamentoMedico;

    @MockBean
    private MedicoRepository repository;

    @Test
    @WithMockUser
    @DisplayName("Deveria retornar 201, quando as informações de cadastro estiverm válidas")
    void cadastrar_cenario1() throws Exception {
        var dadosCadastro = new DadosCadastroMedico("Samanta", "samanta.med@gmail.com", "159357", "852316497", Especialidade.CARDIOLOGIA, dadosEndereco());

        when(repository.save(any())).thenReturn(new Medico(dadosCadastro));

        var response = mvc
                .perform(post("/medicos")
                .contentType(MediaType.APPLICATION_JSON)
                .content(dadosCadastroMedico.write(dadosCadastro).getJson()))
                .andReturn().getResponse();

        var dadosDetalhamento = new DadosDetalhamentoMedico(
                null,
                dadosCadastro.nome(),
                dadosCadastro.email(),
                dadosCadastro.crm(),
                dadosCadastro.telefone(),
                dadosCadastro.especialidade(),
                new Endereco(dadosCadastro.endereco())
        );

        var jsonEsperado = dadosDetalhamentoMedico.write(dadosDetalhamento).getJson();

        assertThat(response.getStatus()).isEqualTo(HttpStatus.CREATED.value());
        assertThat(response.getContentAsString()).isEqualTo(jsonEsperado);
    }

    private DadosEndereco dadosEndereco() {
        return new DadosEndereco(
                "rua xpto",
                "bairro",
                "00000000",
                "Brasilia",
                "DF",
                null,
                null
        );
    }
}