我有一个运行在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一起工作?
发布于 2022-06-28 17:22:15
从2.1.214版本开始,H2希望每个模式的索引名称都是唯一的。我在医生的任何地方都没有找到这个。但是,我通过查看源代码来证实这一点。Schema
类使用ConcurrentHashMap
来包含与架构相关的所有索引,并且名称不以表名作为前缀,以使它们在每个表中都是唯一的。
我通过创建表作为预测试操作的一部分来解决这个限制( JUnit测试中的@pre方法)。这并不理想,因为我实际上绕过了自动创建表的代码,但这对我的情况来说已经足够了,因为我正在测试代码的另一个部分。
正如JB所提到的,使用像H2这样的模拟数据库进行测试有一些局限性,而且它不是生产环境的完美反映。每当我需要类似于环境的精确生产时,我就会使用容器化的数据库作为单元测试的一部分。
考虑到H2当前的局限性,希望这将为您提供关于如何处理特定场景的新视角。
https://stackoverflow.com/questions/51930582
复制相似问题