gpt4 book ai didi

java - 在内存数据库中使用 H2 进行 Spring 测试截断所有表

转载 作者:行者123 更新时间:2023-11-29 02:16:24 29 4
gpt4 key购买 nike

我是一名初级 CS 专业学生,使用 spring 从事 MVC 项目,我对 spring 还很陌生。

我在内存中搭建了一个H2的db,写了2个sql脚本;一个用于填充数据库,另一个用于将其清空。

据我所知,truncate table <table name> 之间的实际区别和 delete from <table name>截断表是 ddl,因此它更快,它还会重置自动递增的列。问题是 H2 的截断表不会重置自动递增的列。你能指出我哪里搞砸了吗?

我正在使用 spring 的 SqlGroup 注释来运行脚本。

@SqlGroup({
@Sql(executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD, scripts =
"classpath:populate.sql"),
@Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts =
"classpath:cleanup.sql")
})

这是应该截断每个表的 cleanup.sql。

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE TABLE `criteria`;
TRUNCATE TABLE `job_title`;
TRUNCATE TABLE `organization`;
TRUNCATE TABLE `organization_teams`;
TRUNCATE TABLE `organization_users`;
TRUNCATE TABLE `organization_job_titles`;
TRUNCATE TABLE `review`;
TRUNCATE TABLE `review_evaluation`;
TRUNCATE TABLE `team`;
TRUNCATE TABLE `team_members`;
TRUNCATE TABLE `user`;
TRUNCATE TABLE `user_criteria_list`;

SET FOREIGN_KEY_CHECKS=1;

并且 populate.sql 只是在不违反完整性约束的情况下向这些表中插入一堆行。

所以当我运行我的测试类时,只有第一个方法通过。剩下的我得到这样的东西:

引用完整性约束违规:“FK3MAB5XYC980PSHDJ3JJ6XNMMT:PUBLIC.ORGANIZATION_JOB_TITLES FOREIGN KEY(JOB_TITLES_ID) REFERENCES PUBLIC.JOB_TITLE(ID) (1)”;语句:插入 organization_job_titles (organization_id, job_titles_id) VALUES(1, 1)

我认为问题是由于未重置自动递增的列引起的。所以我写了一个不同的测试类:

monAutoIncTest.java

 @Sql(executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD, scripts =
"classpath:truncateTable.sql")
public class monAutoIncTest {
@Autowired
OrganizationService organizationService;

@Test
public void h2truncate_pls() throws BaseException {
organizationService.add(new Organization("Doogle"));
Organization fetched = organizationService.getByName("Doogle");
Assert.assertEquals(1, fetched.getId());
}

@Test
public void h2truncate_plz() throws BaseException {
organizationService.add(new Organization("Zoogle"));
Organization fetched = organizationService.getByName("Zoogle");
Assert.assertEquals(1, fetched.getId());
}
}

使用 truncateTable.sql

SET FOREIGN_KEY_CHECKS=0;

TRUNCATE TABLE `organization`;

SET FOREIGN_KEY_CHECKS=1;

当测试运行时,先运行的那个方法通过,另一个给我这个。

java.lang.AssertionError:预期:1实际:2

最佳答案

目前 H2 不支持该功能,但我们可以在 their roadmap 中看到此类计划

TRUNCATE should reset the identity columns as in MySQL and MS SQL Server (and possibly other databases).

尝试将此语句与 TRUNCATE 组合使用:

ALTER TABLE [table] ALTER COLUMN [column] RESTART WITH [initial value]

关于java - 在内存数据库中使用 H2 进行 Spring 测试截断所有表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38995951/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com