Конфигурация Spring для встроенной базы данных H2 для тестов - PullRequest
40 голосов
/ 06 января 2010

Как выглядит конфигурация Spring для интеграционных тестов с использованием встроенного источника данных h2 и, необязательно, JUnit?

Моя первая попытка с SingleConnectionDataSource в основном сработала, но не удалась в более сложных тестах, где требуется несколько соединений одновременно или приостановленные транзакции. Я думаю, что h2 в tcp-режиме сервера может также работать, но это, вероятно, не самый быстрый режим связи для временной встроенной базы данных в памяти.

Каковы возможности и их преимущества / недостатки? Кроме того, как вы создаете таблицы / заполняете базу данных?


Обновление: давайте уточним некоторые конкретные требования, которые важны для таких тестов.

  • База данных должна быть временной и в памяти
  • Соединение, вероятно, не должно использовать tcp, для требований к скорости
  • Было бы неплохо, если бы я мог использовать инструмент базы данных для проверки содержимого базы данных во время отладки
  • Нам нужно определить источник данных, поскольку мы не можем использовать источник данных серверов приложений в модульных тестах

Ответы [ 4 ]

48 голосов
/ 07 февраля 2012

С оговоркой, что я не знаю, существует ли какой-либо инструмент, который может проверять базу данных, я думаю, что простым решением было бы использование встроенной базы данных Spring ( 3.1.x docs , current docs ), который поддерживает HSQL, H2 и Derby.

Используя H2, ваша конфигурация xml будет выглядеть следующим образом:

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

Если вы предпочитаете конфигурацию на основе Java,Вы можете создать экземпляр DataSource следующим образом (обратите внимание, что EmbeddedDataBase extends DataSource):

@Bean(destroyMethod = "shutdown")
public EmbeddedDatabase dataSource() {
    return new EmbeddedDatabaseBuilder().
            setType(EmbeddedDatabaseType.H2).
            addScript("db-schema.sql").
            addScript("db-test-data.sql").
            build();
}

Таблицы базы данных создаются сценарием db-schema.sql они заполняются тестовыми данными из скрипта db-test-data.sql .

Не забудьте добавить драйвер базы данных H2 в ваш путь к классам.

18 голосов
/ 07 января 2010

В настоящее время я включаю только Springconfig-файл для тестирования в качестве источника данных:

<bean id="database.dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
    <constructor-arg>
        <bean class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
            <property name="driverClass" value="org.h2.Driver" />
            <property name="url"
                value="jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;MODE=Oracle;TRACE_LEVEL_SYSTEM_OUT=2" />
        </bean>
    </constructor-arg>
</bean>

<!-- provides a H2 console to look into the db if necessary -->
<bean id="org.h2.tools.Server-WebServer" class="org.h2.tools.Server" 
    factory-method="createWebServer" depends-on="database.dataSource" 
    init-method="start" lazy-init="false">
    <constructor-arg value="-web,-webPort,11111" />
</bean>

Создание / удаление таблиц можно выполнить с помощью executeSqlScript при переопределении AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction или с SimpleJdbcTestUtils.executeSqlScript в соответствующем месте.

Сравните также это сообщение .

9 голосов
/ 20 октября 2012

H2 связан со встроенной реализацией пула соединений. Следующий XML предоставляет пример использования его в качестве компонента источника данных без необходимости введения дополнительных зависимостей от DBCP или C3P0:

<bean id="dataSource" class="org.h2.jdbcx.JdbcConnectionPool" destroy-method="dispose">
    <constructor-arg>
        <bean class="org.h2.jdbcx.JdbcDataSource">
            <property name="URL" value="jdbc:h2:dbname"/>
            <property name="user" value="user"/>
            <property name="password" value="password"/>
         </bean>
    </constructor-arg>
</bean> 

База данных будет закрыта путем вызова метода dispose, когда контекст приложения Spring закроется.

0 голосов
/ 06 января 2010

Я думаю, что лучше использовать вашу производственную реализацию DataSource (только с другой строкой соединения) для юнит-тестов.

В любом случае «провал на более сложных тестах» не дает достаточно информации для более подробного ответа.

(Самореклама: отметьте )

...