Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Proyecto] Mi propuestaTest para MedicoController

@SpringBootTest
@AutoConfigureMockMvc
@AutoConfigureJsonTesters
@WithMockUser
class MedicoControllerTest {
    private final MockMvc mockMvc;

    @MockitoBean
    private MedicoRepository repository;

    @Autowired
    private JacksonTester<DatosRegistroMedico> datosRegistroMedicoJson;

    @Autowired
    private JacksonTester<DatosDetalleMedico> datosDetalleMedicoJson;

    @Autowired
    MedicoControllerTest(MockMvc mockMvc) {
        this.mockMvc = mockMvc;
    }

    @Test
    void registrarMedicoSinBodyRespondeStatus400() throws Exception {
        var resp = mockMvc.perform(post("/medicos")).andReturn().getResponse();

        assertThat(resp.getStatus()).isEqualTo(HttpStatus.BAD_REQUEST.value());
    }

    @Test
    void registrarMedicoConBodyValidoRespondeStatus200() throws Exception {
        var datosDireccion = datosDireccion();
        var medico = new Medico(
                null, true, "Médico 1", "medico1@mail.com", "3008882121",
                "1000000", Especialidad.CARDIOLOGIA, new Direccion(datosDireccion)
        );

        when(repository.save(any())).thenReturn(medico);

        var response = mockMvc.perform(post("/medicos")
                        .contentType(MediaType.APPLICATION_JSON)
                        .content(datosRegistroMedicoJson
                                .write(new DatosRegistroMedico("Médico 1", "medico1@mail.com",
                                        "3008882121", "1000000", Especialidad.CARDIOLOGIA,
                                        datosDireccion))
                                .getJson()))
                .andReturn()
                .getResponse();

        var jsonEsperado = datosDetalleMedicoJson.write(new DatosDetalleMedico(medico)).getJson();

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

    private DatosDireccion datosDireccion() {
        return new DatosDireccion(
                "Calle x",
                10L,
                "complemento",
                "barrio",
                "ciuedad",
                "estado",
                "123456"
        );
    }
}
1 respuesta

Hola Wilmar, espero que estés bien

¡Gracias por compartir tu código! Parece que estás trabajando en la creación de pruebas automatizadas para el método registrar de la clase MedicoController. Tu enfoque general se ve bastante bien, pero hay algunos detalles que podrías revisar para asegurarte de que todo funcione como esperas.

  1. Anotación @MockBean: En tu código, has usado @MockitoBean para el MedicoRepository. Asegúrate de que estás utilizando @MockBean en lugar de @MockitoBean, ya que @MockBean es la anotación correcta para inyectar un mock en el contexto de Spring Boot.

    @MockBean
    private MedicoRepository repository;
    
  2. Constructor de MedicoControllerTest: Veo que estás usando un constructor para inyectar MockMvc. Aunque esto puede funcionar, una práctica común es usar la anotación @Autowired directamente sobre el campo mockMvc. Esto simplifica el código y sigue el patrón estándar de inyección de dependencias en Spring.

    @Autowired
    private MockMvc mockMvc;
    
  3. Verificación de Respuesta HTTP: En tu prueba registrarMedicoConBodyValidoRespondeStatus200, estás verificando que el estado sea HttpStatus.CREATED.value(), lo cual es correcto ya que un recurso nuevo debería devolver un estado 201 (Created). Asegúrate de que tu controlador realmente esté configurado para devolver este estado al crear un nuevo médico.

  4. Datos de Prueba: Parece que tus datos de prueba están bien estructurados. Solo asegúrate de que los datos que estás usando en DatosRegistroMedico y DatosDetalleMedico coincidan con lo que tu aplicación espera recibir y devolver.

  5. Revisar Mensajes de Error: Si encuentras que las pruebas fallan, revisa los mensajes de error detenidamente. A menudo, proporcionan pistas valiosas sobre lo que podría estar fallando, ya sea en los datos de entrada, en la configuración de los mocks, o en la lógica del controlador.

Espero que estas sugerencias te ayuden a ajustar tu prueba y a avanzar en tu proyecto. ¡Bons estudios!