Java Spring启动测试数据库初始化运行两次

Java Spring启动测试数据库初始化运行两次,java,spring,hibernate,spring-boot,jpa,Java,Spring,Hibernate,Spring Boot,Jpa,我正在测试一个springboot批处理应用程序。我正在使用一个内存中的H2 DB,我想用一些数据初始化它,但由于唯一索引或主键冲突而失败:primary_key_7 ON… 我尝试过调整应用程序.properties,添加和删除 spring.jpa.hibernate.ddl-auto=create-drop spring.jpa.properties.hibernate.default_schema=AD1 同时调整spring.datasource.url 该实体如下: spring.

我正在测试一个springboot批处理应用程序。我正在使用一个内存中的H2 DB,我想用一些数据初始化它,但由于
唯一索引或主键冲突而失败:primary_key_7 ON…

我尝试过调整
应用程序.properties
,添加和删除

spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.properties.hibernate.default_schema=AD1
同时调整
spring.datasource.url

该实体如下:

spring.datasource.platform=h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS AD1
spring.datasource.username=sa
spring.datasource.password=sa
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.default_schema=AD1
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.batch.job.enabled=false
@表格(schema=“ad1”,name=“Student”)
公立班学生{
@身份证
@列(name=“student\u id”)
私人字符串学生ID;
@列(name=“学生姓名”)
私有字符串studentName;
@列(name=“喜爱的主题”)
私人字符串偏好主题;
@列(name=“注册日期”)
私有LocalDate注册日期;
}
需要注意的是,
schema
属性已设置为
ad1

data-h2.sql
位于
src/test/resources
中,如下所示:

spring.datasource.platform=h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS AD1
spring.datasource.username=sa
spring.datasource.password=sa
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.default_schema=AD1
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.batch.job.enabled=false
插入ad1.Student(学生id、学生姓名、最喜欢的科目、入学日期)值('1151AB26'、'John'、'Math',截止日期('01-JAN-19'、'DD-MON-RR');
src/test/resources
中的
application.properties
如下所示:

spring.datasource.platform=h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS AD1
spring.datasource.username=sa
spring.datasource.password=sa
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.default_schema=AD1
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

spring.batch.job.enabled=false
需要注意的是,
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_关闭_上的_退出=错误;模式=Oracle;INIT=如果AD1不存在,则创建架构
。我必须将模式初始化为AD1

我正在使用Cucumber,因此我有一个Cucumber测试类:

@RunWith(Cucumber.class)
@CucumberOptions(features=“src/test/resources”,plugin={“pretty”,“html:target/cucumber”})
公营黄瓜试验{
}
最后但并非最不重要的是Spring启动测试类

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes=StudentBatchApplication.class,webEnvironment=SpringBootTest.webEnvironment.RANDOM\u端口)
@上下文配置
公共抽象类SpringCumberIntegrationTest{
当我启动测试时,会发生以下情况:

Caused by: org.h2.jdbc.JdbcSQLException: Unique index or primary key violation: "PRIMARY_KEY_7 ON AD1.Student(student_id) VALUES ('1151AB26', 1)"; SQL statement:
Insert into AD1.Student (student_id,student_name,favourite_subject,enrollment_date) values ('1151AB26','John','Math',to_date('01-JAN-19','DD-MON-RR')) [23505-197]

当我对此进行故障排除时,通过在初始化发生时放置断点,流程将运行同一行两次:

( /* key:1 */ '1151AB26', 'John', 'Math', TIMESTAMP '2019-01-01 00:00:00')
( /* key:2 */ '1151AB26', 'John', 'Math', TIMESTAMP '2019-01-01 00:00:00')

紧接着,它抛出异常。

正如我所提到的,在故障排除的过程中,我注意到
data-h2.sql
中的一行不知何故被运行了两次,从而导致了这种独特的索引冲突。进一步的故障排除,我追溯到了加载数据脚本的过程中的点(即,
data-h2.sql
)并注意到它加载了此脚本两次。一次在
target\classes\data-h2.sql
中,一次在
target\test classes\data-h2.sql
中。我真的不知道为什么要将此脚本文件复制到
target\classes\data-h2.sql

最后,我发现这是一个eclipse问题。当我使用命令行
mvn clean test
运行测试时,测试运行得非常完美,但当我使用eclipse
Run As->JUnit test
运行测试时,我会遇到这个问题。出于某种原因,每当我在eclipse
Project->clean
it中清理应用程序时,我都会遇到这个问题将
src/main/resources
src/test/resources
中的所有资源文件粘贴到
target\classes
中。我要做的是将以下行添加到我的
.classpath
文件中