Модульное тестирование MyBatis с HSQL вместо Oracle

Я хотел бы провести модульное тестирование моего уровня сохраняемости MyBatis, используя базу данных HSQL в памяти.Настоящее приложение использует базу данных Oracle. Это сработало отлично, пока мы начали добавлять автоматически увеличивающиеся числа для столбцов id. Oracle требует использования последовательности для получения увеличенного числа, поэтому в базе данных Oracle была создана последовательность с именем base_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: Ошибка при выборе ключа или установке результата объекту параметра. Причина: java.sql.SQLSyntaxErrorException: у пользователя отсутствуют права доступа или объект не найден : DUAL; плохая грамматика SQL []; вложенное исключение: java.sql.SQLSyntaxErrorException: у пользователя отсутствуют права доступа или объект не найден: DUAL

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

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


Я использую:

  • Spring 3.0.5
  • HSQL 2.2.4
  • MyBatis 3.0.5

ОБНОВЛЕНИЕ:

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

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

<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>

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

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

(если вы запускаете этот сценарий много раз во время модульного тестирования, не забудьте добавить отбрасывающую последовательность BASIS_SEQ, если существует; в начало схемы .sql)

14
задан Luwil 24 October 2011 в 13:20
поделиться