Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

[Duda] Test registrar

Hola buen día, tengo una duda del proyecto del repo, no tengo "DatosDetalleMedico" en su lugar tengo "DatosRespuestaMedico", mi pregunta es si debo crear un constructor nuevo?

package med.voll.api.domain.medico;

import med.voll.api.domain.direccion.DatosDireccion;

public record DatosRespuestaMedico(Long id, String nombre, String email, String telefono, String documento,
                                   DatosDireccion direccion) {
}
package med.voll.api.controller;

import med.voll.api.domain.direccion.DatosDireccion;
import med.voll.api.domain.direccion.Direccion;
import med.voll.api.domain.medico.*;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.json.AutoConfigureJsonTesters;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.json.JacksonTester;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.security.test.context.support.WithMockUser;
import org.springframework.test.web.servlet.MockMvc;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;


@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
class MedicoControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Autowired
    private JacksonTester<DatosRegistroMedico> datosRegistroMedicoJson;

    @Autowired
    private JacksonTester<DatosRespuestaMedico> datosRespuestaMedicoJson;

    @Autowired
    private MedicoRepository medicoRepository;

    @Test
    @DisplayName("Deberia devolver codigo http 400 cuando las informaciones son invalidas")
    @WithMockUser
    void registrarMedico_escenario1() throws Exception {

        var response =  mockMvc.perform(post("/medicos"))
                .andReturn().getResponse();
        assertThat(response.getStatus())
                .isEqualTo(HttpStatus.BAD_REQUEST.value());
    }

    @Test
    @DisplayName("Deberia devolver codigo http 200 cuando las informaciones son validas")
    @WithMockUser
    void registrarMedico_escenario2() throws Exception {

        var datosRegistro = new DatosRegistroMedico(
                "medico",
                "medico@gmail.com",
                "456789",
                "765432",
                Especialidad.CARDIOLOGIA,
                datosDireccion());
        when(medicoRepository.save(any())).thenReturn(new Medico(datosRegistro));

        var response = mockMvc.perform(post("/medicos")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(datosRegistroMedicoJson.write(datosRegistro).getJson()))
                .andReturn().getResponse();
        var datosRespuesta = new DatosRespuestaMedico(
                datosRegistro.nombre(),
                datosRegistro.email(),
                datosRegistro.documento(),
                datosRegistro.telefono(),
                datosRegistro.especialidad(),
                new Direccion(datosRegistro.direccion())
        );
        var jsonEsperado = datosRespuestaMedicoJson.write(datosRespuesta).getJson();

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

      }
        private DatosDireccion datosDireccion() {
            return new DatosDireccion(
                    "calle Entre Rios",
                    "distrito",
                    "Santa Fe",
                    "321",
                    "complemento"
            );
        }
    }

El primer test pasa, pero el segundo me marca error (rojo)" datosRegistro.nombre()," " datosRegistro.especialidad(), new Direccion(datosRegistro.direccion())"

Imagen Consola

2 respuestas

¡Hola Christian!

Entiendo que estás teniendo un problema con el segundo test en tu proyecto. Parece que estás intentando acceder a propiedades que no existen en el objeto DatosRegistroMedico. La razón de este error podría ser que estás intentando acceder a propiedades que no pertenecen a la clase DatosRegistroMedico.

Si en lugar de "DatosDetalleMedico" estás utilizando "DatosRespuestaMedico", es posible que necesites ajustar el objeto datosRegistro para que coincida con las propiedades de la nueva clase. Asegúrate de que estás utilizando las propiedades correctas al momento de crear el objeto datosRegistro.

Por ejemplo, si la clase DatosRespuestaMedico tiene las propiedades nombre, email, documento, telefono, especialidad y direccion, entonces el objeto datosRegistro debería tener esas mismas propiedades.

La próxima vez que quieras compartir tu código, en lugar de usar una captura de pantalla, puedes hacerlo clicando en este botón y colocando tu código entre los acentos:

clicka donde aparece "</>"

Espero que esto te ayude a solucionar el problema. Si necesitas más ayuda, no dudes en preguntar.

¡Espero haber ayudado y buenos estudios!

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios

El escenario2 me funcionó de la siguiente manera sin modificar o agregar más constructores:

    @Test
    @DisplayName("Debería devolver código http 200 cuando recibe la información válida")
    @WithMockUser
    void registrarMedicoEscenario2() throws Exception {
        DatosRegistroMedico datosRegistroMedico = new DatosRegistroMedico(
                "Medico1", "medico1@vollmed.com", "4790123",
                "12345", Especialidad.CARDIOLOGIA, datosDireccion()
        );

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

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


        var jsonEsperado = datosRespuestaMedicoJson.write(
                new DatosRespuestaMedico(
                        0L,
                        datosRegistroMedico.nombre(),
                        datosRegistroMedico.email(),
                        datosRegistroMedico.telefono(),
                        datosRegistroMedico.especialidad().toString(),
                        datosRegistroMedico.direccion()
                )
        )
                .getJson();

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

    }
    

    private DatosDireccion datosDireccion(){
        return new DatosDireccion(
                "calle x",
                "distrito y",
                "ciudad z",
                "123",
                "1"
        );
    }