gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 07:31:15 25 4
gpt4 key购买 nike

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

Index "USERNAME_INDEX" already exists; SQL statement: create index userName_index on MyTable1 (userName)

问题似乎是我们的域类具有不同表的同名索引:

MyTable : userName_index on column userName
MyTable1 : userName_index on column userName

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

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

我们无法更改索引名称。我也试过像这样将 MySQL 模式添加到连接 URL:

"jdbc:h2:mem:./MyService;MODE=MySQL;DB_CLOSE_DELAY=-1;"

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

最佳答案

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

我通过将表创建为预测试操作的一部分(JUnit 测试中的@Before 方法)来解决此限制。这并不理想,因为我有效地绕过了自动创建表格的代码,但这对我的情况来说已经足够了,因为我正在测试代码的不同部分。

正如 JB Nizet 提到的,使用像 H2 这样的模拟数据库进行测试有一些局限性,并且不能完美反射(reflect)生产环境。每当我需要精确的生产环境时,我都会使用容器化数据库作为单元测试的一部分。

鉴于 H2 当前的局限性,希望这能让您对如何处理您的特定场景有新的看法。

关于java - H2 中用于单元测试的现有索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51930582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com