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



我有一套Play!我一直在针对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的伪枚举。

是否有一种方法可以在游戏中测试H2中的枚举模型?

这里有一个适用于H2 -的弹簧引导的解决方案这两者都不依赖,所以你可以这样做类似的游戏

请注意,这是一个假的,并不是真的允许完全测试枚举,但它允许您运行测试针对预先存在的生产db(您不能直接进行更改)模式)而不必自己编写整个DDL。

所以,不要让测试框架为内存db设置连接字符串,而是自己配置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将自定义(域)数据类型enum视为varchar—显然您可以将其大小更改为任何大小。

作为INIT cause,确保在任何框架

对其执行ddl的第一位之前执行它。

所以,在Play!设置将是db.default.jdbcUrl -或者无论你定义你的测试数据库连接(例如作为一个trait)

通常JPA会为您将其转换为基本类型。参见映射枚举在JPA与固定值?或JPA Enum序数与字符串。我认为这是独立于数据库的唯一方法。