Как подделать столбцы ENUM в базе данных H2 для тестирования игровых модулей? - PullRequest
3 голосов
/ 03 ноября 2011

У меня есть набор Play! модульные тесты, которые я выполнял на базе данных H2. Я добавил в мою модель несколько столбцов enum, и теперь тесты не пройдены из-за операторов 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?

Ответы [ 2 ]

5 голосов
/ 28 октября 2016

Вот обходной путь, который работает для весенней загрузки с H2 - это не зависит от того, хотя, так что вы можете сделать что-то похожее на игру.

Обратите внимание, что это фальшивка и не очень позволяет тестировать перечисления полностью, но позволяет запускать тесты по отношению к уже существующим производственным базам данных (где вы не можете просто пойти и изменить схема) без необходимости писать весь 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, что пользовательский (доменный) тип enum следует рассматривать как varchar - вы, очевидно, можете изменить размер на любой.

Это делается как причина INIT, которая обеспечивает выполнение до того, как первый бит ddl будет выполнен для него любой framework

Таким образом, в случае Play! значение будет db.default.jdbcUrl - или, тем не менее, вы определяете ваше тестовое соединение с базой данных (например, в качестве признака)

1 голос
/ 03 ноября 2011

Обычно JPA переводит его для вас в базовый тип. См. Карта enum в JPA с фиксированными значениями? или JPA Enum ORDINAL vs STRING . Я думаю, что это единственный способ стать независимым от базы данных.

...