1
resposta

[Bug] Dúvida no teste automatizado do curso 'SpringBoot 3: documente, teste, e prepare uma API para o deploy'

Olá, venho depois de muito tentar resolver com a IA Gemini inclusive: O teste do MedicoRepository está dando erro e não identifico o porquê. Ficou identico ao professor, mas não sei se desde a aula e as últimas atualizações está provocando isso. Pois no teste ConsultaControllerTest foi esse o problema e resolvi. Vou publicar o erro para ver se conseguem me ajudar, acredito que possuam acesso ao projeto completo desse curso, a minha API está idêntica. O método está estranho :

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

essa declaração está fora de uma variável e é ela quem dá problema:

cadastrarConsulta(medico, paciente, proximaSegundaAs10);
    consultas
    (data, medico_id, motivo_cancelamento, paciente_id) 
values
    (?, ?, ?, ?)

2024-09-04T18:44:41.561-03:00 WARN 33032 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 1054, SQLState: 42S22 2024-09-04T18:44:41.562-03:00 ERROR 33032 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Unknown column 'motivo_cancelamento' in 'field list'

org.hibernate.exception.SQLGrammarException: could not execute statement [Unknown column 'motivo_cancelamento' in 'field list'] [insert into consultas (data,medico_id,motivo_cancelamento,paciente_id) values (?,?,?,?)]

Caused by: java.sql.SQLSyntaxErrorException: Unknown column 'motivo_cancelamento' in 'field list' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:121) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1054) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1003) at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1312) at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:988) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:194)

####O meu banco de dados####

mysql> desc consultas; +---------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------------------+--------------+------+-----+---------+----------------+ | id | bigint | NO | PRI | NULL | auto_increment | | medico_id | bigint | NO | MUL | NULL | | | paciente_id | bigint | NO | MUL | NULL | | | data | datetime | NO | | NULL | | | motivo_cancelamento | varchar(100) | YES | | NULL | | +---------------------+--------------+------+-----+---------+----------------+ 5 rows in set (0.01 sec)

Fico no aguardo de resposta :)

1 resposta

Olá, Janara! Tudo bem?

O erro "Unknown column 'motivo_cancelamento' in 'field list'" indica que o Hibernate está tentando inserir um valor nessa coluna, mas ela não está sendo reconhecida pelo banco de dados.

Vamos verificar alguns pontos para tentar resolver esse problema:

  1. Atualização do Banco de Dados: Certifique-se de que a coluna motivo_cancelamento realmente existe no banco de dados e está corretamente mapeada na sua entidade Consulta. Pelo que você mostrou, ela está presente no banco de dados, mas é importante garantir que a estrutura do banco esteja atualizada.

  2. Mapeamento da Entidade: Verifique se a classe Consulta está mapeada corretamente. Ela deve ter um campo para motivo_cancelamento. Algo como:

    @Entity
    public class Consulta {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
    
        @ManyToOne
        private Medico medico;
    
        @ManyToOne
        private Paciente paciente;
    
        private LocalDateTime data;
    
        private String motivoCancelamento;
    
        // getters e setters
    }
    
  3. Scripts de Migração: Se você estiver utilizando scripts de migração (por exemplo, Flyway ou Liquibase), verifique se o script que adiciona a coluna motivo_cancelamento foi executado corretamente.

  4. Sincronização do Hibernate: Certifique-se de que o Hibernate está sincronizado com o estado atual do banco de dados. Às vezes, pode ser necessário forçar a atualização do esquema. Você pode fazer isso configurando a propriedade spring.jpa.hibernate.ddl-auto para update no seu application.properties ou application.yml:

    spring.jpa.hibernate.ddl-auto=update
    
  5. Limpar e Reconstruir o Banco de Dados: Como último recurso, você pode tentar limpar o banco de dados e deixá-lo ser recriado pelo Hibernate, especialmente se estiver em um ambiente de desenvolvimento. Isso pode ser feito deletando o banco de dados e deixando o Hibernate recriá-lo.

Espero que essas dicas ajudem a resolver o problema. Bons estudos!

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