java序列未为模拟HSQL db重置,并导致JBehave测试之间的约束冲突
在使用API(Spring+Hibernate)编写BDD测试时,我遇到了排序问题。 我们使用JBehave作为BDD运行程序和hsqldb
基本上,我创建了以下案例来解释我遇到的问题
我有两个故事。这两个故事都会插入一个名为DUMMYPRODUCT的表。 我们指定在每个场景之前,清除所有数据并使用以下命令重置模式:
“截断架构公共重新启动标识并不提交检查”
然后我们使用预定义的sql脚本重新初始化表数据,该脚本包括对DUMMYPRODUCT的2个插入
并使用
产品的投放顺序; 创建序列DUMMYPRODUCT_SEQ,从3开始,递增10
但我遇到了非常奇怪的行为,因为故事和场景之间的序列没有重置。 相反,它们似乎继续到下一个故事/场景,然后在其中重置,即不进入下一个序列块,导致发生约束冲突
exception=java。sql。SQLIntegrityConstraintViolationException:完整性约束冲突:唯一约束或索引冲突;SYS_PK_10216表:DUMMYPRODUCT
经历的行为 为DUMMYPRODUCTID插入DUMMYPRODUCT
(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
27例外情况
29例外情况
您在过去的HSQL实现中是否遇到过这样的问题
# 1 楼答案
在将db作为单独的实例运行并更改为H2db后,我们找到了问题的根源。db不喜欢在每个场景运行时删除、重新创建甚至更改序列。我们将脚本分为数据插入脚本和序列更改脚本。使用dbunit清除数据,然后在每次运行时插入脚本。序列仅在启动时更改,bdd故事按预期顺序递增
# 2 楼答案
该语句重新启动表中声明的标识序列:
此语句对架构中的所有表执行上述操作,并重置表外的序列:
删除序列的语句将永久删除该序列。当你再次创建它时,没有留下任何痕迹
所有这些都可以通过最新的HSQLDB 2.3进行测试。X您可能正在使用旧版本,或者您的一条语句可能没有实际执行。注意:你应该用一条语句删除序列,然后用另一条语句重新创建序列