猿问

Spring Boot 测试数据库初始化运行两次

我正在测试 Spring Boot 批处理应用程序。我正在使用内存中的 H2 DB,我想用一些数据对其进行初始化,但它因Unique index or primary key violation: PRIMARY_KEY_7 ON ....


我试过调整application.properties,添加和删除


spring.jpa.hibernate.ddl-auto=create-drop

spring.jpa.properties.hibernate.default_schema=AD1

还调整了spring.datasource.url.


实体如下:


@Table(schema = "ad1",name = "Student")

public class Student {


    @Id

    @Column(name = "student_id")

    private String studentId;


    @Column(name = "student_name")

    private String studentName;


    @Column(name = "favourite_subject")

    private String favouriteSubject;


    @Column(name = "enrollment_date")

    private LocalDate enrollmentDate;


}

要注意的是该schema属性已设置为ad1


data-h2.sql住的地方src/test/resources如下:


Insert into ad1.Student (student_id,student_name,favourite_subject,enrollment_date) values ('1151AB26','John','Math',to_date('01-JAN-19','DD-MON-RR'));

application.properties同样在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

要注意的是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. 我必须将架构初始化为 AD1


我正在使用 Cucumber,所以我有一个 Cucumber 测试类:


@RunWith(Cucumber.class)

@CucumberOptions(features = "src/test/resources", plugin = { "pretty", "html:target/cucumber" })

public class CucumberTest {



翻过高山走不出你
浏览 265回答 1
1回答

哆啦的时光机

正如我所提到的,在故障排除过程中,我注意到里面的一行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都会将所有资源文件src/main/resources从. 我所要做的就是将以下行添加到我的文件中。src/test/resourcestarget\classes.classpath<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">&nbsp; &nbsp; <attributes>&nbsp; &nbsp; &nbsp; &nbsp; <attribute name="maven.pomderived" value="true"/>&nbsp; &nbsp; &nbsp; &nbsp; <attribute name="test" value="true"/>&nbsp; &nbsp; </attributes></classpathentry>
随时随地看视频慕课网APP

相关分类

Java
我要回答