В мене виникла проблема з H2 DB під час розробки фукнціональних тестів для аплікейшна, в якого MySQL (MariaDB) в проді – а H2 DB, відповідно, в функціональних тестах.
В H2 DB, як виявляється, немає більшості функцій для конверсії дат, наявних в MySQL – а саме мені забракло такої примітивної речі як UNIX_TIMESTAMP (яка в MySQL конвертує дати в, ясне діло, unix timestamp).
В результаті код то працює, але фукнціональний тест не написати, бо SQL запит, який чудово працюе сам по собі, в тестах валиться через відсутність UNIX_TIMESTAMP.
Фікс виявився дуже простим – в H2 DB в якості функції реєструється джавішний static метод через виклик CREATE ALIAS. Т.я. classpath в тестах спільний з classpath-ом H2 DB, працюючий код тесту виглядає приблизно так (JUnit4+Spring):
package my.package; class MyTestClass { public static long unixTimestamp(java.sql.Timestamp datetime) { return datetime.getTime() / 1000; } @Autowired DataSource dataSource; @Before public void beforeTestInit() { try (Connection conn = dataSource.getConnection()) { conn.createStatement().execute("CREATE ALIAS IF NOT EXISTS UNIX_TIMESTAMP FOR \"my.package.MyTestClass.unixTimestamp\""); } catch (SQLException e) { throw new RuntimeException(e); } } @Test public void doYourStuff() throws Exception { // Ваш тест тут } }
От і все. Boom, done.
Сподіваюсь комусь цей приклад стане на пригоді.