为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

翻过高山走不出你 2023-03-23 14:12:51
我正在测试 Spring Boot 批处理应用程序。我正在使用内存中的 H2 DB,我想用一些数据对其进行初始化,但它因Unique index or primary key violation: PRIMARY_KEY_7 ON ....我试过调整application.properties,添加和删除spring.jpa.hibernate.ddl-auto=create-dropspring.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属性已设置为ad1data-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=h2spring.datasource.driver-class-name=org.h2.Driverspring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=Oracle;INIT=CREATE SCHEMA IF NOT EXISTS AD1spring.datasource.username=saspring.datasource.password=saspring.jpa.database-platform=org.hibernate.dialect.H2Dialectspring.jpa.properties.hibernate.default_schema=AD1spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImplspring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImplspring.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 {
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

正如我所提到的,在故障排除过程中,我注意到里面的一行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">

    <attributes>

        <attribute name="maven.pomderived" value="true"/>

        <attribute name="test" value="true"/>

    </attributes>

</classpathentry>


查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 264 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号