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

erro ao executar testes escolherMedicoAleatorioLivreNaDataCenario1 e escolherMedicoAleatorioLivreNaDataCenario2

Java HotSpot(TM) 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended Hibernate: insert into medicos (ativo,crm,email,bairro,cep,cidade,complemento,logradouro,numero,uf,especialidade,nome,telefone) values (?,?,?,?,?,?,?,?,?,?,?,?,?) 2023-07-29T21:08:57.930-03:00 WARN 14888 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000 2023-07-29T21:08:57.930-03:00 ERROR 14888 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'cidade' cannot be null

org.hibernate.exception.ConstraintViolationException: could not execute statement [Column 'cidade' cannot be null] [insert into medicos (ativo,crm,email,bairro,cep,cidade,complemento,logradouro,numero,uf,especialidade,nome,telefone) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]

Caused by: java.sql.SQLIntegrityConstraintViolationException: Column 'cidade' cannot be null

Hibernate: insert into medicos (ativo,crm,email,bairro,cep,cidade,complemento,logradouro,numero,uf,especialidade,nome,telefone) values (?,?,?,?,?,?,?,?,?,?,?,?,?) 2023-07-29T21:08:57.947-03:00 WARN 14888 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1048, SQLState: 23000 2023-07-29T21:08:57.947-03:00 ERROR 14888 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Column 'cidade' cannot be null

org.hibernate.exception.ConstraintViolationException: could not execute statement [Column 'cidade' cannot be null] [insert into medicos (ativo,crm,email,bairro,cep,cidade,complemento,logradouro,numero,uf,especialidade,nome,telefone) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]

6 respostas

Posta teu código da classe MedicoRepositoryTest por favor

package med.voll.api.domain.medico;

import med.voll.api.domain.consulta.Consulta; import med.voll.api.domain.endereco.DadosEndereco; import med.voll.api.domain.paciente.DadosCadastroPaciente; 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.TemporalAdjuster; import java.time.temporal.TemporalAdjusters;

import static org.assertj.core.api.Assertions.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("Deveria devolver null quando unico medico cadastrado não esta disponivel na data")
void escolherMedicoAleatorioLivreNaDataCenario1() {
    var proximaSegundaAs10 = LocalDate.now()
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .atTime(10,0);

    var medico = cadastrarMedico("Medico", "medico@voll.med", "123456", Especialidade.CARDIOLOGIA);
    var paciente = cadastrarPaciente("Paciente", "paciente@email.com", "00000000000");
    cadastrarConsulta(medico, paciente, proximaSegundaAs10);

    var medicoLivre = medicoRepository.escolherMedicoAleatorioLivreNaData(Especialidade.CARDIOLOGIA, proximaSegundaAs10);
    assertThat(medicoLivre).isNull();
}

@Test
@DisplayName("Deveria devolver medico quando ele estiver disponivel na data")
void escolherMedicoAleatorioLivreNaDataCenario2() {
    var proximaSegundaAs10 = LocalDate.now()
            .with(TemporalAdjusters.next(DayOfWeek.MONDAY))
            .atTime(10,0);

   var medico = cadastrarMedico("Medico", "medico@voll.med", "123456", Especialidade.CARDIOLOGIA);

    var medicoLivre = medicoRepository.escolherMedicoAleatorioLivreNaData(Especialidade.CARDIOLOGIA, proximaSegundaAs10);
    assertThat(medicoLivre).isEqualTo(medico);
}

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

private Medico cadastrarMedico(String nome, String email, String crm, Especialidade especialidade) {
    var medico = new Medico(dadosMedico(nome, email, crm, especialidade));
    em.persist(medico);
    return medico;
}

private Paciente cadastrarPaciente(String nome, String email, String cpf) {
    var paciente = new Paciente(dadosPaciente(nome, email, cpf));
    em.persist(paciente);
    return paciente;
}

private DadosCadastroMedico dadosMedico(String nome, String email, String crm, Especialidade especialidade) {
    return new DadosCadastroMedico(
            nome,
            email,
            "61999999999",
            crm,
            especialidade,
            dadosEndereco()
    );
}

private DadosCadastroPaciente dadosPaciente(String nome, String email, String cpf) {
    return new DadosCadastroPaciente(
            nome,
            email,
            "61999999999",
            cpf,
            dadosEndereco()
    );
}

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

}

Acho que o erro pode ser no método dadosEndereco()

Verifica se a classe DadosEndereco possui os parâmetros na seguinte ordem:

Logradouro
Bairro
CEP
Cidade
UF
numero
complemento

Ou então me manda o seu código da classe DadosEndereco

public record DadosEndereco( @NotBlank String logradouro, @NotBlank String bairro, @NotBlank @Pattern(regexp = "\d{8}") String cep, @NotBlank String uf, String complemento, String numero, @NotBlank String cidade) {

}

Olá Ygor, o erro que está acontecendo é que sua Record DadosEndereco está recebendo os parâmetros na ordem errada, desta maneira tu recebe os campos de forma errada, como no caso onde tu recebeu o campo cidade (que não pode ser null) como null.

Recomendo que tu mude o seguinte campo na classe MedicoRepositoryTest:

private DadosEndereco dadosEndereco() {
    return new DadosEndereco(
            "rua xpto",
            "bairro",
            "00000000",
            "DF",
            null,
            null,
            "Brasilia"
    );
}
solução!

obrigado deu certo