web-dev-qa-db-fra.com

Spring Boot 2 - Base de données H2 - @SpringBootTest - Échec sur org.h2.jdbc.JdbcSQLException: la table existe déjà

Impossible de tester Spring Boot & H2 avec un script de création de table à l'aide de schema.sql.

Donc, ce qui se passe, c'est que j'ai les propriétés suivantes définies:

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.initialization-mode=always
spring.datasource.username=sa
spring.datasource.password=
spring.datasource.platform=h2
spring.datasource.url=jdbc:h2:mem:city;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.generate-ddl=false
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

et, je m'attends à ce que les tables soient créées à l'aide de schema.sql. L'application fonctionne très bien lorsque j'exécute gradle bootRun . Cependant, lorsque j'exécute des tests en utilisant gradle test , mes tests pour le référentiel réussissent, mais celui de mon service échoue en déclarant qu'il essaie de créer la table lorsque la table existe déjà:

Exception levée:

Caused by: org.h2.jdbc.JdbcSQLException: Table "CITY" already exists;             
SQL statement:
CREATE TABLE city ( id BIGINT NOT NULL, country VARCHAR(255) NOT NULL, map VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, state VARCHAR(2555) NOT NULL, PRIMARY KEY (id) ) [42101-196]
at org.h2.message.DbException.getJdbcSQLException(DbException.Java:345)
at org.h2.message.DbException.get(DbException.Java:179)
at org.h2.message.DbException.get(DbException.Java:155)
at org.h2.command.ddl.CreateTable.update(CreateTable.Java:117)
at org.h2.command.CommandContainer.update(CommandContainer.Java:101)
at org.h2.command.Command.executeUpdate(Command.Java:260)
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.Java:192)
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.Java:164)
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.Java:95)
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.Java)
at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.Java:471)
... 105 more

Le code est configuré et prêt à recréer le scénario. README contient toutes les informations -> https://github.com/tekpartner/learn-spring-boot-data-jpa-h2

9
Tora Tora Tora

Si les tests sont exécutés individuellement, ils réussissent. Je pense que le problème est dû au fait que schema.sql est exécuté deux fois sur la même base de données. Il échoue la deuxième fois car les tables existent déjà.

Pour contourner ce problème, vous pouvez définir spring.datasource.continue-on-error=true dans application.properties.

Une autre option consiste à ajouter le @AutoConfigureTestDatabase annotation le cas échéant afin qu'une base de données intégrée unique soit utilisée pour chaque test.

4
Madhura Bhave

Vous pouvez essayer deux autres solutions:

  1. Ajouter un drop table if exists [tablename] dans votre schema.sql avant de créer la table.
  2. Modifiez l'instruction de CREATE TABLE à CREATE TABLE IF NOT EXISTS
3
the hand of NOD