7
respuestas

ERROR: org.opentest4j.AssertionFailedError

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad Buenos dias: en los primeros test que estoy encarando, me sale este error. Por lo que entiendo, espera un valor y recibo otro. Cómo lo corrijo? Desde ya, muchas gracias!

7 respuestas

Hola Alejandra,

Este error generalmente ocurre cuando una afirmación en tus pruebas unitarias falla, es decir, cuando el resultado esperado no coincide con el resultado actual.

En tu caso, parece que estás probando un método de un repositorio en Spring Boot. Según el contexto proporcionado, parece que estás probando dos escenarios diferentes: uno en el que se espera que el método devuelva null y otro en el que se espera que devuelva un objeto Médico.

Si el error ocurre en el primer escenario, significa que el método no está devolviendo null cuando debería. Si ocurre en el segundo escenario, significa que el objeto Médico devuelto por el método no es igual al objeto Médico esperado.

Para corregir este error, necesitarás revisar tu código y asegurarte de que el método que estás probando se comporta como se espera.

  1. Asegúrate de que el método que estás probando está implementado correctamente. Si el método se supone que debe devolver null bajo ciertas condiciones, asegúrate de que esas condiciones estén bien definidas en el método.

  2. Si estás utilizando datos simulados o una base de datos en memoria para tus pruebas, asegúrate de que estos datos estén configurados correctamente. Si el método que estás probando depende de ciertos datos en la base de datos, esos datos necesitan estar presentes y ser correctos para que la prueba pase.

  3. Revisa las afirmaciones en tus pruebas. Si estás utilizando el método assertEquals, por ejemplo, asegúrate de que el primer argumento es el resultado esperado y el segundo argumento es el resultado actual. También, asegúrate de que estás comparando los objetos correctos. Si estás comparando objetos personalizados, como el objeto Médico en tu caso, es posible que necesites sobrescribir el método equals en la clase Médico para que la comparación funcione correctamente.

Espero que estas sugerencias te ayuden a corregir el error. Mucho éxito en todo lo que te propongas y si tienes alguna duda aquí estaremos para apoyarte.

¡Vamos juntos!

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

Gracias por las respuesta. El Test que falla es el primero, que debería retornar NULL, pero retorna med.voll.api.domain.medico.Medico@41 A continuación paso lo que tengo en Medico y en el siguiente mensaje paso el MedicoRepositoryTest, porque pase el limite de caracteres:

package med.voll.api.domain.medico;

import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; import med.voll.api.domain.direccion.Direccion;

@Table(name="medicos") @Entity(name = "Medico") @Getter // Crea todos los getters @NoArgsConstructor //Crea un constructor vacio @AllArgsConstructor //Crea un constructor con argumentos @EqualsAndHashCode(of = "id") // Usa el parametro Id para las comparaciones entre medicos public class Medico { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nombre; private String email; private String telefono; private String documento; @Enumerated(EnumType.STRING) private Especialidad especialidad; @Embedded private Direccion direccion; private Boolean activo;

public Medico(DatosRegistroMedico datosRegistroMedico) {
    this.activo = true;
    this.nombre = datosRegistroMedico.nombre();
    this.email = datosRegistroMedico.email();
    this.documento = datosRegistroMedico.documento();
    this.telefono = datosRegistroMedico.telefono();
    this.especialidad = datosRegistroMedico.especialidad();
    this.direccion = new Direccion(datosRegistroMedico.direccion());

}

public void actualizarDatos(DatosActualizarMedico datosActualizarMedico) {
    if(datosActualizarMedico.nombre() != null){
        this.nombre = datosActualizarMedico.nombre();
    }

    if(datosActualizarMedico.documento() != null) {
        this.documento = datosActualizarMedico.documento();
    }

    if(datosActualizarMedico.direccion() != null) {
        this.direccion = direccion.actualizarDatos(datosActualizarMedico.direccion());
    }
}

public void desactivarMedico() {
    this.activo = false;
}

}

package med.voll.api.domain.medico;

import med.voll.api.domain.consulta.Consulta; import med.voll.api.domain.direccion.DatosDireccion; import med.voll.api.domain.paciente.DatosRegistroPaciente; import med.voll.api.domain.paciente.Paciente; 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.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager; import org.springframework.test.context.ActiveProfiles;

import java.time.DayOfWeek; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.TemporalAdjusters;

//import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.junit.jupiter.api.Assertions.*;

@DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) @ActiveProfiles("test") class MedicoRepositoryTest {

@Autowired
private MedicoRepository medicoRepository;
@Autowired
private TestEntityManager em;

@Test
@DisplayName("deberia retornar nulo cuando el medico se encuentre en consulta con otro paciente en ese horario")
void seleccionarMedicoConEspecialidadEnFechaEscenario1() {

    //given
    var proximoLunes10H = LocalDate.now()
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .atTime(10,0);

    var medico=registrarMedico("Jose","j@mail.com","123456",Especialidad.CARDIOLOGIA);
    var paciente= registrarPaciente("antonio","a@mail.com","654321");
    registrarConsulta(medico,paciente,proximoLunes10H);

    //when
    var medicoLibre = medicoRepository.seleccionarMedicoConEspecialidadEnFecha(Especialidad.CARDIOLOGIA,proximoLunes10H);

    //then
   // assertThat(medicoLibre).isNull();
    assertNull(medicoLibre);
}

@Test
@DisplayName("deberia retornar un medico cuando realice la consulta en la base de datos  en ese horario")
void seleccionarMedicoConEspecialidadEnFechaEscenario2() {

    //given
    var proximoLunes10H = LocalDate.now()
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .atTime(10,0);

    var medico=registrarMedico("Jose","j@mail.com","123456",Especialidad.CARDIOLOGIA);

    //when
    var medicoLibre = medicoRepository.seleccionarMedicoConEspecialidadEnFecha(Especialidad.CARDIOLOGIA,proximoLunes10H);

    //then
    //assertThat(medicoLibre).isEqualTo(medico);
    assertEquals(medicoLibre, medico);
}

private void registrarConsulta(Medico medico, Paciente paciente, LocalDateTime fecha) {
    em.persist(new Consulta(null, medico, paciente, fecha, null));
}

private Medico registrarMedico(String nombre, String email, String documento, Especialidad especialidad) {
    var medico = new Medico(datosMedico(nombre, email, documento, especialidad));
    em.persist(medico);
    return medico;
}

private Paciente registrarPaciente(String nombre, String email, String documento) {
    var paciente = new Paciente(datosPaciente(nombre, email, documento));
    em.persist(paciente);
    return paciente;
}

private DatosRegistroMedico datosMedico(String nombre, String email, String documento, Especialidad especialidad) {
    return new DatosRegistroMedico(
            nombre,
            email,
            "61999999999",
            documento,
            especialidad,
            datosDireccion()
    );
}

private DatosRegistroPaciente datosPaciente(String nombre, String email, String documento) {
    return new DatosRegistroPaciente(
            nombre,
            email,
            "61999999999",
            documento,
            datosDireccion()
    );
}

private DatosDireccion datosDireccion() {
    return new DatosDireccion(
            "loca",
            "azul",
            "Acapulco",
            "321",
            "12",
            "Quilmes",
            "1876",
            "Buenos Aires"
    );
}

}

Hola! espero que no sea muy tarde la respuesta, me parece que tu test esta funcionando, en tu base de datos debes tener mas de un medico con la especialidad CARDIOLOGIA , entonces te devuelve uno que este libre en esa fecha y hora, proba imprimiendo ambos antes del assertNull



//assertThat(medicoLibre).isNull();
        System.out.println(medico);
        System.out.println(medicoLibre);
        assertNull(medicoLibre);


//Pobablemente tengas un resultado asi:

med.voll.api.domain.medico.Medico@5c
med.voll.api.domain.medico.Medico@48

org.opentest4j.AssertionFailedError: 
Expected :null
Actual   :med.voll.api.domain.medico.Medico@48

como veras son dos referencias diferentes, para que pase la prueba deberias probar con una especialidad que no tenga medicos disponibles en el horario de la consulta. ejm, GINECOLOGIA, ese no usa el instructor en ningun momento

Saludos! y Buenos estudios!

En mi caso que estoy usando mysql, la bases de datos de test toca tenerla limpia sin datos.

Yo habia copiado los datos de la base de datos original a la de test pero en esa generaba el error que te sale que encontraba un medico random porque ya habian datos almancenados.

De acuerdo a lo que entiendo, al usar el test con spring este siempre mantiene la bases limpia para evitar estos problemas con los test.

Ah, entonces deberia hacer un nuevo migration con los datos de la tabla para que pueda procesar la petición, verdad?

yo lo que hice fue solo crear la base de datos nueva en workbench y asi si funcionó el test.