我有一套玩!我一直在针对 H2 数据库运行的单元测试。我在模型中添加了一些枚举列,由于用于创建模型表的 sql 语句,测试现在失败了。
错误信息是:
14:42:10,435 ERROR ~ Unknown data type: "ENUM"; SQL statement:
一些搜索表明,有一些方法可以在 H2 中模拟枚举(例如: http://groups.google.com/group/h2-database/search?group=h2-database&q=enum&qt_g=Search+this+group )
将 Play 设置为使用 H2Dialect 进行测试模式并不能解决问题。似乎根本原因是 H2 不支持枚举,或者 H2Dialect 可能不知道 H2 的伪枚举。
Play 中有没有办法在 H2 中使用枚举测试模型?
最佳答案
这里有一个适用于带有 H2 的 spring-boot 的解决方法 -
它不依赖于任何一个,所以你可以做
类似的东西玩。
请注意,这是一个 假货并没有真正
让您测试 完全枚举,但它允许您 运行 测试
针对预先存在的生产数据库(您不能只是去改变
模式),而不必自己编写整个 DDL。
因此,与其让您的测试框架为内存数据库设置连接字符串,不如自己配置 H2 连接字符串。
在我的情况下,魔术设置的外观如下:
# the next line is very important it names the ddl work
# H2 does not support enums
# In order to fake support for them we have to declare a
# domain called enum and mapped it to a varchar - the size
# I picked at random but it is "good enough" for now.
# H2 will run this before hibernate creates the schema and
# then the schema creation will succeed
spring.datasource.url=jdbc:h2:mem:test;MODE=MySQL;INIT=CREATE DOMAIN IF NOT EXISTS enum as VARCHAR(255);DB_CLOSE_ON_EXIT=FALSE
魔法是这样的:
CREATE DOMAIN IF NOT EXISTS enum as VARCHAR(255)
这告诉 H2 将自定义(域)数据类型枚举视为 varchar - 您显然可以将大小更改为任何大小。
它就像一个
INIT
确保在任何框架对其执行 ddl 的第一位之前执行它的原因所以,在 的情况下玩! 设置为
db.default.jdbcUrl
- 或者您定义您的测试数据库连接(例如作为特征)
关于hibernate - 如何在 H2 数据库中伪造 ENUM 列以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7988599/