Конфигурация Spring для встроенной базы данных H2 для тестирования
Как выглядит ваша конфигурация Spring для тестов интеграции с использованием встроенного источника данных h2 и, необязательно, JUnit?
Моя первая попытка с SingleConnectionDataSource в основном работала, но не сработала при более сложных тестах, где вам нужно несколько соединений одновременно или приостановленные операции. Я думаю, что h2 в режиме tcp на основе сервера может работать, но это, вероятно, не самый быстрый режим связи для временной встроенной базы данных в памяти.
Каковы возможности и их преимущества/недостатки? Кроме того, как вы создаете таблицы/заполняете базу данных?
Обновление: укажите конкретные требования, важные для таких тестов.
- База данных должна быть временной и в памяти
- Соединение, вероятно, не должно использовать tcp, для требований скорости
- Было бы неплохо, если бы я мог использовать инструмент базы данных для проверки содержимого базы данных во время отладки
- Мы должны определить источник данных, поскольку мы не можем использовать источник данных серверов приложений в модульных тестах
Ответы
Ответ 1
С оговоркой, что я не знаю, есть ли какой-либо инструмент, который может проверять базу данных, я думаю, что простым решением было бы использовать встроенную базу данных Spring (3.1.x 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 script, и они заполняются тестовыми данными из db-test-data.sql script.
Не забудьте добавить драйвер базы данных H2 в свой путь к классам.
Ответ 2
В настоящее время я включаю только тестовый файл 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 в соответствующем месте.
Сравните также эту публикацию.
Ответ 3
H2 поставляется со встроенной реализацией пула подключений. Следующий XML предоставляет пример использования его в качестве источника данных bean без необходимости вводить дополнительные зависимости от 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.
Ответ 4
Я думаю, что лучше всего использовать вашу производственную реализацию DataSource (только с другой строкой соединения) для модульных тестов.
В любом случае "не удалось выполнить более сложные тесты" не дает достаточно информации для более подробного ответа.
(Self-ad: проверьте это)