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

ERRO NO TESTE MEDICOREPOSTORY NO CENARIO1

Fiz o código igual o professor estava fazendo na aula porém o teste falhou retornou o seguinte erro tanto para o cenario 1 e 2 ,retornando mesmo erro para ambos,
Insira aqui a descrição dessa imagem para ajudar na acessibilidade Hibernate:
insert
into
medicos
(ativo, crm, email, bairro, cep, cidade, complemento, logradouro, numero, uf, especialidade, nome, telefone)
values
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2025-07-31T15:07:03.477-03:00 WARN 12908 --- [api] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1062, SQLState: 23000
2025-07-31T15:07:03.477-03:00 ERROR 12908 --- [api] [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '123456' for key 'medicos.crm'

org.hibernate.exception.ConstraintViolationException: could not execute statement [Duplicate entry '123456' for key 'medicos.crm'] [insert into medicos (ativo,crm,email,bairro,cep,cidade,complemento,logradouro,numero,uf,especialidade,nome,telefone) values (?,?,?,?,?,?,?,?,?,?,?,?,?)]

at org.hibernate.dialect.MySQLDialect.lambda$buildSQLExceptionConversionDelegate$3(MySQLDialect.java:1245)
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:58)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:108)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197)
at org.hibernate.id.insert.GetGeneratedKeysDelegate.performMutation(GetGeneratedKeysDelegate.java:116)
at org.hibernate.engine.jdbc.mutation.internal.MutationExecutorSingleNonBatched.performNonBatchedOperations(MutationExecutorSingleNonBatched.java:47)
at org.hibernate.engine.jdbc.mutation.internal.AbstractMutationExecutor.execute(AbstractMutationExecutor.java:55)
at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.doStaticInserts(InsertCoordinatorStandard.java:194)
at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.coordinateInsert(InsertCoordinatorStandard.java:132)
at org.hibernate.persister.entity.mutation.InsertCoordinatorStandard.insert(InsertCoordinatorStandard.java:95)
at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:85)
at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:682)
at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:293)
at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:274)
at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:324)
at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:394)
at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:308)
at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:224)
at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:136)
at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:177)
at org.hibernate.event.internal.DefaultPersistEventListener.persist(DefaultPersistEventListener.java:95)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:79)
at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:55)
at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:127)
at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:761)
at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:745)
at org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager.persist(TestEntityManager.java:92)
at med.voll.api.domain.medico.MedicoRepositoryTest.cadastrarMedico(MedicoRepositoryTest.java:55)
at med.voll.api.domain.medico.MedicoRepositoryTest.escolherMedicoAleatorioLivreNaDataCenario1(MedicoRepositoryTest.java:41)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)

Caused by: java.sql.SQLIntegrityConstraintViolationException: Duplicate entry '123456' for key 'medicos.crm'

1 resposta
solução!

Olá, Maria! Como vai?

Pelo erro que você descreveu, parece que o problema está relacionado a uma violação de chave única no banco de dados, especificamente no campo crm da tabela medicos. Isso acontece quando você tenta inserir um médico com um crm que já existe no banco de dados.

Aqui estão algumas sugestões para resolver o problema:

  1. Verifique os Dados de Teste: Certifique-se de que, antes de cada teste, o banco de dados esteja limpo ou que os dados inseridos não causem conflitos. Você pode fazer isso garantindo que cada teste use dados únicos.

  2. Limpeza do Banco de Dados: Utilize a anotação @Transactional nos seus testes para que o Spring faça o rollback automático após cada teste. Isso ajuda a garantir que o banco esteja limpo para o próximo teste.

  3. Dados Dinâmicos: Ao cadastrar médicos nos testes, utilize dados dinâmicos para o crm, como gerar um número aleatório ou incrementar um contador.

Aqui está um exemplo de como você pode modificar o método de cadastro de médicos para evitar duplicações:

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

Isso adiciona um sufixo baseado no tempo atual ao crm, reduzindo a chance de duplicação.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.