Модульный тест MyBatis с HSQL вместо Oracle

Я хотел бы модульно протестировать мой слой персистентности MyBatis, используя базу данных HSQL в памяти. Реальное приложение использует базу данных Oracle. Это сработало отлично unitl мы начали добавлять автоматически увеличенные числа для столбцов id. Oracle требует использования последовательности для получения увеличенного числа, поэтому в базе данных Oracle была создана последовательность basis_seq. В моем XML-файле MyBatis mapper у меня есть это:

<insert id="insertBasis" parameterType="com.foo.Basis" useGeneratedKeys="true" keyProperty="id">
        <selectKey resultType="long" keyProperty="id" order="BEFORE">
            SELECT basis_seq.NEXTVAL FROM DUAL
        </selectKey>
        insert into basis
        (id, name)
        values
        (#{id}, #{name})
</insert>

это работает, когда я запускаю приложение, но модульный тест получает ошибка:

org.springframework.интерфейс jdbc.BadSqlGrammarException: ошибка выбора ключа или установка результата в объект параметра. Причина: Ява.язык SQL.SQLSyntaxErrorException: пользователю не хватает привилегий или объект не найдено: DUAL; плохая грамматика SQL []; вложенное исключение Ява.язык SQL.SQLSyntaxErrorException: пользователю не хватает привилегий или объект не найдено: двойной

как я понимаю, "двойной" - это своего рода виртуальная таблица в Oracle, которая хранит последовательности, и я не в моей тестовой базы данных. Если я удалю <selectKey>-пометьте работу модульного теста (поскольку HSQL может автогенерировать идентификаторы для столбцов с пометкой identity), но не реальное применение. Одним из обходных путей было бы создание отдельных XML-файлов MyBatis mapper для модульных тестов без <selectKey>-tag, но это нежелательно, так как я хочу проверить реальную конфигурацию.

есть ли способ создать и использовать последовательность в HSQL, а также или, может быть, некоторые обходные пути MyBatis для этого? Или я должен использовать другой база данных для моего модульного теста, такого как H2?


я использую:

  • Весна 3.0.5
  • HSQL в данном случае является 2.2.4
  • 3.0.5 MyBatis

обновление:

после получения ответа из fredt, вот как я отредактировал свою весеннюю конфигурацию:

прежде чем я определил свой источник данных с помощью:

<jdbc:embedded-database id="dataSource">
    <jdbc:script location="classpath:test-data/schema.sql" />
    <jdbc:script location="classpath:test-data/data.sql" />
</jdbc:embedded-database>

теперь я делаю это:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver" />
    <property name="url" value="jdbc:hsqldb:mem:test;sql.syntax_ora=true" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<jdbc:initialize-database data-source="dataSource">
    <jdbc:script location="classpath:test-data/schema.sql" />
    <jdbc:script location="classpath:test-data/data.sql" />
</jdbc:initialize-database>

кроме того, в схеме.sql мне нужно создать последовательности:

CREATE SEQUENCE BASIS_SEQ START WITH 1000 INCREMENT BY 1;
CREATE SEQUENCE OTHER_SEQ START WITH 1000 INCREMENT BY 1;

(если вы запустите этот скрипт много раз во время модульного тестирования, не забудьте добавить drop sequence BASIS_SEQ if exists; в верхней части схемы.в SQL)

2 ответов


последний HSQLDB обеспечивает обширную совместимость синтаксиса Oracle. Все что вам нужно это добавить sql.syntax_ora=true к URL вашей базы данных. Например:

jdbc:hsqldb:mem:test;sql.syntax_ora=true

см. Руководство

http://hsqldb.org/doc/2.0/guide/deployment-chapt.html

http://hsqldb.org/doc/2.0/guide/dbproperties-chapt.html

совместимость синтаксиса SQL постоянно расширяется в новых версиях HSQLDB, поэтому лучше всего использовать последние доступные версия.


вы все еще можете использовать исходную конфигурацию 4 линий, используя <jdbc:embedded-database ...>. Просто добавьте следующую строку в начале тестовых данных/схемы.sql-файл:

SET DATABASE SQL SYNTAX ORA TRUE;

это эффективно так же, как добавление sql.syntax_ora=true к вашему URL JDBC.