我在使用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实施中遇到过这样的问题?
答案 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故事按预期顺序递增。