序列不会重置模拟HSQL数据库并导致JBehave测试之间的约束违规

时间:2014-02-17 10:45:53

标签: java spring hibernate integration-testing hsqldb

我在使用API​​(Spring + Hibernate)编写BDD测试时遇到了排序问题。 我们使用JBehave作为我们的BDD运行程序和HSQL数据库。

基本上我创建了以下案例来解释我遇到的问题。

我有两个故事。两个故事都插入到名为DUMMYPRODUCT的表中。 我们指定在每个场景之前清除所有数据并使用以下内容重置架构

“TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK”

然后我们使用预定义的sql脚本重新初始化表数据,该脚本包含2个DUMMYPRODUCT插入,

使用

重置序列(假设)

DROP SEQUENCE DUMMYPRODUCT_SEQ; 创建序列DUMMYPRODUCT_SEQ以3增加3;

但是我遇到了极其奇怪的行为,因为序列不会在故事和场景之间重置。 相反,他们似乎继续下一个故事/场景,然后在内部重置,即。不进入下一个序列块,导致违反约束。

exception = java.sql.SQLIntegrityConstraintViolationException:完整性约束违规:唯一约束或索引违规; SYS_PK_10216表:DUMMYPRODUCT

行为经历 插入DUMMYPRODUCT以获取DUMMYPRODUCTID

(DUMMYPRODUCTID)
第一个故事
情景
3
4

下一个故事
方案
5
6
7
8
9
10个
11个
12个
3
4
5例外 7例外 9例外 方案
11个
12个
3
4
5
6
7
8
9
10个
11例外 13个
14个
15个
16个
17个
18个
19个
20个
21个
22个
23个
24个
25个
26个
方案
27个
28个
29个
30个
31个
32个
3
4
5
6
7
8
9
10个
11个
12个
13个
14个
15个
16个
17个
18个
19个
20个
21个
22个
23个
24个
25个
26个
例外情况 29例外

您过去是否在HSQL实施中遇到过这样的问题?

2 个答案:

答案 0 :(得分:1)

该语句重新启动表中声明的IDENTITY序列:

TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK

此语句对模式中的所有表执行上述操作,并重置表外的序列:

TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK

删除序列的语句会永久删除它。再次创建它时没有任何痕迹。

以上所有内容都可以使用最新的HSQLDB 2.3.X进行测试您可能正在使用旧版本,或者您的某个语句可能未实际执行。请注意,您应该使用一个语句删除序列,然后使用另一个语句再次创建它。

答案 1 :(得分:0)

将db作为单独的实例运行并更改为H2db后,我们找到了问题的根源。 db不喜欢在每个场景运行时删除和重新创建甚至更改序列。我们将脚本分成数据插入脚本和序列更改脚本。使用dbunit清除数据,然后在每次运行时使用插入脚本。序列仅在启动时被更改,bdd故事按预期顺序递增。