DevUA

Meta


Брак SQL функцій в H2 DB – вирішення проблеми

Микола МахінМикола Махін

В мене виникла проблема з 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.

Сподіваюсь комусь цей приклад стане на пригоді.