【问题标题】:spring boot is executing data.sql and schema.sql twice?spring boot 执行 data.sql 和 schema.sql 两次?
【发布时间】:2021-10-06 02:05:13
【问题描述】:

我正在尝试测试 Spring Boot 应用程序。我正在使用一个内存 H2 DB,我想用一些数据进行初始化,并通过在项目表中添加一个元素后比较数据库中的数据数量来实现集成测试,但测试失败并且当我尝试跟踪 data.sql 和 schema.sql 执行两次的执行情况。

测试类

@ContextConfiguration(classes=ProjectManagementApplication.class)
@RunWith(SpringRunner.class)
@DataJpaTest
@SqlGroup(@Sql( executionPhase = ExecutionPhase.BEFORE_TEST_METHOD, scripts= {"classpath:schema.sql","classpath:data.sql"}))
public class ProjectRepositoryIntegrationTest {
    @Autowired
    ProjectRepository proRepo;
    @Autowired
    EmployeeRepository empRepo;
    @Test
    public void ifNewProjectSaved_thenSuccess() {
        Project newProject=new Project("new Project","COMPLETED","test Description");
        proRepo.save(newProject);
        List<Project> pro= proRepo.findAll();
        for(int i=0;i<pro.size();i++) {
            System.out.println(pro.get(i));
        }
        assertEquals(5,pro.size());
    }

}

架构文件

CREATE SEQUENCE IF NOT EXISTS employee_seq;

CREATE TABLE IF NOT EXISTS employee (

employee_id BIGINT NOT NULL DEFAULT nextval('employee_seq') PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
lastname VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL


);

CREATE SEQUENCE IF NOT EXISTS project_seq;

CREATE TABLE IF NOT EXISTS project (

project_id BIGINT NOT NULL DEFAULT nextval('project_seq') PRIMARY KEY,
name VARCHAR(100) NOT NULL,
stage VARCHAR(100) NOT NULL,
description VARCHAR(500) NOT NULL

);


CREATE TABLE IF NOT EXISTS employee_project (

project_id BIGINT REFERENCES project, 
employee_id BIGINT REFERENCES employee

);

数据.sql

-- INSERT EMPLOYEES         
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'John', 'Warton', 'warton@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Mike', 'Lanister', 'lanister@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Steve', 'Reeves', 'Reeves@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Ronald', 'Connor', 'connor@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Jim', 'Salvator', 'Sal@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Peter', 'Henley', 'henley@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Richard', 'Carson', 'carson@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Honor', 'Miles', 'miles@gmail.com');
insert into employee (employee_id, first_name, lastname, email) values (nextval('employee_seq'), 'Tony', 'Roggers', 'roggers@gmail.com');

-- INSERT PROJECTS          
insert into project (project_id, name, stage, description) values (nextval('project_seq'), 'Large Production Deploy', 'NOTSTARTED', 'This requires all hands on deck for the final deployment of the software into production');
insert into project (project_id, name, stage, description) values (nextval('project_seq'), 'New Employee Budget',  'COMPLETED', 'Decide on a new employee bonus budget for the year and figureout who will be promoted');
insert into project (project_id, name, stage, description) values (nextval('project_seq'), 'Office Reconstruction', 'INPROGRESS', 'The office building in Monroe has been damaged due to hurricane in the region. This needs to be reconstructed');
insert into project (project_id, name, stage, description) values (nextval('project_seq'), 'Improve Intranet Security', 'INPROGRESS', 'With the recent data hack, the office security needs to be improved and proper security team needs to be hired for implementation');

-- INSERT PROJECT_EMPLOYEE_RELATION
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Warton' AND p.name = 'Large Production Deploy');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Warton' AND p.name = 'New Employee Budget');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Warton' AND p.name = 'Office Reconstruction');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Reeves' AND p.name = 'Large Production Deploy');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Warton' AND p.name = 'New Employee Budget');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Warton' AND p.name = 'Improve Intranet Security');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Henley' AND p.name = 'Office Reconstruction');
insert into employee_project (employee_id, project_id) (select e.employee_id, p.project_id from employee e, project p where e.lastname ='Henley' AND p.name = 'Improve Intranet Security');                                                         

【问题讨论】:

    标签: java spring-boot hibernate h2 spring-test


    【解决方案1】:

    Spring Boot 的DataSource 初始化将自动应用classpath:schema.sqlclasspath:data.sql 文件,而无需在您的测试类上使用@SqlGroup@Sql

    您应该从测试类中删除 @SqlGroup@Sql 或禁用 DataSource 初始化。实现后者设置spring.datasource.initialization-mode=never(Spring Boot 2.4 及更早版本)或spring.sql.init.mode=never(Spring Boot 2.5 及更高版本)。

    【讨论】:

    • 或者改用 Flyway。
    猜你喜欢
    • 1970-01-01
    • 2016-10-13
    • 2022-10-05
    • 2015-03-11
    • 2021-04-07
    • 2018-08-26
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多