如何伪造H2数据库中的ENUM列进行游戏单元测试?

时间:2011-11-02 23:30:06

标签: hibernate playframework h2

我有一套游戏!单元测试我一直在对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

设置播放以将H2Dialect用于测试模式无法解决问题。似乎根本原因是H2不支持枚举,或者H2Dialect可能不知道H2的伪枚举。

Play中有没有办法在H2中测试带枚举的模型?

2 个答案:

答案 0 :(得分:5)

这里有一个适用于带有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 - 或者您定义测试数据库连接(例如,作为特征)

答案 1 :(得分:1)

通常JPA会将它转换为基本类型。请参阅Map enum in JPA with fixed values?JPA Enum ORDINAL vs STRING。我认为这是与数据库无关的唯一方法。