programing

스프링 부트 2 - H2 데이터베이스 - @SpringBoot테스트 - org.h2.jdbc에서 실패했습니다.JdbcSQL 예외:테이블이 이미 있습니다.

closeapi 2023. 7. 15. 10:09
반응형

스프링 부트 2 - H2 데이터베이스 - @SpringBoot테스트 - org.h2.jdbc에서 실패했습니다.JdbcSQL 예외:테이블이 이미 있습니다.

schema.sql을 사용하여 테이블을 만들기 위한 스크립트로 Spring Boot & H2를 테스트할 수 없습니다.

다음과 같은 속성이 설정되어 있습니다.

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

그리고 테이블은 schema.sql을 사용하여 생성될 것으로 예상합니다.gradle bootRun을 실행하면 응용 프로그램이 잘 작동합니다.그러나 gradle test를 사용하여 테스트를 실행하면 Repository에 대한 테스트는 통과하지만 my Service에 대한 테스트는 테이블이 이미 존재할 때 테이블을 생성하려고 한다는 표시가 나타나지 않습니다.

예외 발생:

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

코드가 설정되고 시나리오를 재생성할 준비가 되었습니다.README는 모든 정보를 가지고 있습니다 -> https://github.com/tekpartner/learn-spring-boot-data-jpa-h2

테스트를 개별적으로 실행하면 통과합니다.동일한 데이터베이스에 대해 schema.sql이 두 번 실행되어 문제가 발생한 것 같습니다.테이블이 이미 존재하기 때문에 두 번째로 실패합니다.

해결 방법으로 다음을 설정할 수 있습니다.spring.datasource.continue-on-error=true안에application.properties.

다른 옵션은 다음을 추가하는 것입니다.@AutoConfigureTestDatabase각 테스트에 고유한 내장 데이터베이스가 사용되도록 주석을 작성합니다.

시도할 수 있는 다른 두 가지 솔루션이 있습니다.

  1. 추가 adrop table if exists [tablename]테이블을 만들기 전에 schema.sql에 저장합니다.
  2. 문 변경 위치CREATE TABLE로.CREATE TABLE IF NOT EXISTS

db의 이름이 있으면 JVM이 실행되는 동안 메모리에 남아 있습니다.여기서 db 이름은 "city"입니다.

spring.datasource.url=jdbc:h2:mem:city;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

따라서 모든 테스트 클래스에 대해 새 DB를 생성하려면 DB 이름을 생략합니다.

spring.datasource.url=jdbc:h2:mem:;MODE=PostgreSQL;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE

"in memory private" 연결 모드라고 합니다. http://www.h2database.com/html/features.html#connection_modes

언급URL : https://stackoverflow.com/questions/47895212/spring-boot-2-h2-database-springboottest-failing-on-org-h2-jdbc-jdbcsqlex

반응형