在用我们的API (Spring+Hibernate)编写BDD测试时,我遇到了排序问题。我们使用JBehave作为BDD运行程序和HSQL。
基本上,我创建了下面的案例来解释我遇到的问题。
我有两个故事。这两个故事都插入到一个名为DUMMYPRODUCT的表中。我们指定,在每个场景之前,我们清除所有数据并使用以下方法重置架构,
“截断模式公共重新启动标识并不提交检查”
然后我们使用一个预定义的sql脚本重新初始化表数据,其中包含两个插入到DUMMYPRODUCT,
和重置序列(据推测)使用
删除序列DUMMYPRODUCT_SEQ,创建序列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实现中遇到过这样的问题吗?
发布于 2014-03-01 13:40:01
在将db作为单独的实例运行并更改为H2db之后,我们找到了问题的根源。数据库不喜欢每次运行的场景中被删除、重新创建或更改的序列。我们将脚本分离为数据插入脚本和序列更改脚本。使用dbunit清除数据,然后是每次运行时的insert脚本。序列仅在启动时更改,bdd故事按预期顺序递增。
发布于 2014-02-17 16:05:36
语句重新启动表中声明的标识序列:
TRUNCATE TABLE T RESTART IDENTITY AND COMMIT NO CHECK此语句对架构中的所有表执行上述操作,并重置表之外的序列:
TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK删除序列的语句将永久地删除它。当您再次创建它时,没有留下它的痕迹。
所有这些都可以用最新的HSQLDB2.3.X进行测试--您可能使用的是旧版本,或者可能没有实际执行您的一条语句。注意,您应该用一个语句删除序列,然后用另一个语句再次创建它。
https://stackoverflow.com/questions/21826937
复制相似问题