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

StackOverflow https://stackoverflow.com/questions/2012292

Вопрос

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

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

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


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

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

Решение

С оговоркой, что я не знаю, существует ли какой-нибудь инструмент, способный проверять базу данных, думаю, что простым решением будет использование встроенной базы данных Spring (3.1.x документы, текущие документы), который поддерживает 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 простирается 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 в свой путь к классам.

Другие советы

В настоящее время я включаю файл 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 в подходящем месте.

Сравните также эта публикация.

H2 поставляется со встроенной реализацией пула соединений.Следующий XML представляет собой пример использования его в качестве компонента Datasource без необходимости введения дополнительных зависимостей от 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> 

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top