В мене виникла проблема з 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.
Сподіваюсь комусь цей приклад стане на пригоді.