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
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.
Vous pouvez essayer deux autres solutions:
drop table if exists [tablename]
dans votre schema.sql avant de créer la table.CREATE TABLE
à CREATE TABLE IF NOT EXISTS