首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >H2中用于单元测试的现有索引

H2中用于单元测试的现有索引
EN

Stack Overflow用户
提问于 2018-08-20 12:17:17
回答 1查看 658关注 0票数 3

我有一个运行在MySQL数据库上的服务。该服务使用Java编写,并使用Spring & JPA/Hibernate。我们正在使用H2数据库进行单元测试。问题是,当我们运行测试时,在模式创建阶段我们会看到以下错误:

代码语言:javascript
运行
复制
Index "USERNAME_INDEX" already exists; SQL statement: create index userName_index on MyTable1 (userName)

问题似乎是,我们的域类对于不同的表具有相同名称的索引:

代码语言:javascript
运行
复制
MyTable : userName_index on column userName
MyTable1 : userName_index on column userName

因为我们只看到了MyTable1的错误,我们猜测MyTable的索引是成功创建的,然后为MyTable1创建索引失败。

显然,在H2中,每个模式的索引名称必须是唯一的,但是MySQL允许具有相同名称的索引,只要它们位于不同的表中。

我们不能更改索引名。我还尝试将MySQL模式添加到连接URL中,如下所示:

代码语言:javascript
运行
复制
"jdbc:h2:mem:./MyService;MODE=MySQL;DB_CLOSE_DELAY=-1;"

如何使单元测试与具有当前索引名称的H2一起工作?

EN

回答 1

Stack Overflow用户

发布于 2022-06-28 17:22:15

从2.1.214版本开始,H2希望每个模式的索引名称都是唯一的。我在医生的任何地方都没有找到这个。但是,我通过查看源代码来证实这一点。Schema类使用ConcurrentHashMap来包含与架构相关的所有索引,并且名称不以表名作为前缀,以使它们在每个表中都是唯一的。

我通过创建表作为预测试操作的一部分来解决这个限制( JUnit测试中的@pre方法)。这并不理想,因为我实际上绕过了自动创建表的代码,但这对我的情况来说已经足够了,因为我正在测试代码的另一个部分。

正如JB所提到的,使用像H2这样的模拟数据库进行测试有一些局限性,而且它不是生产环境的完美反映。每当我需要类似于环境的精确生产时,我就会使用容器化的数据库作为单元测试的一部分。

考虑到H2当前的局限性,希望这将为您提供关于如何处理特定场景的新视角。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51930582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档