【问题标题】:How to fake ENUM columns in the H2 database for play unit testing?如何伪造 H2 数据库中的 ENUM 列进行播放单元测试?
【发布时间】:2011-12-20 18:37:43
【问题描述】:

我有一套 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 的伪枚举。

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

【问题讨论】:

标签: hibernate playframework h2


【解决方案1】:

这里有一个适用于带有 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 一样,确保它在 any 框架对它执行 ddl 的第一位之前执行它

因此,在 Play! 的情况下,设置将是 db.default.jdbcUrl - 或者您定义测试数据库连接(例如作为特征)

【讨论】:

  • 嗨,我想添加多个创建域语句,因为我有多个枚举,知道如何实现吗?我试过followoing,但它给出了错误。 spring.datasource.url: jdbc:h2:mem:test;MODE=PostgreSQL;INIT=CREATE DOMAIN IF NOT EXISTS pgsql_enum as VARCHAR(255),CREATE DOMAIN IF NOT EXISTS value_type as VARCHAR(255);DB_CLOSE_ON_EXIT=FALSE
  • @jagga 你需要使用“;”作为“CREATE ...”语句之间的分隔符 - 但是您还需要转义“;” - 所以例如“\;” - 请参阅此处了解更多详细信息:stackoverflow.com/questions/5225700/… 如果您有很多语句,我会使用 RUNSCRIPT。
【解决方案2】:

通常 JPA 会将其翻译成基本类型。请参阅Map enum in JPA with fixed values?JPA Enum ORDINAL vs STRING。我认为这是独立于数据库的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-01
    • 2021-07-23
    • 1970-01-01
    • 2015-04-06
    • 2021-09-20
    • 2019-11-15
    • 2021-10-24
    • 1970-01-01
    相关资源
    最近更新 更多