使用embedded h2 datasource和可选的JUnit,您的Spring集成测试配置是什么样的?
我对SingleConnectionDataSource的第一次尝试基本上有效,但在更复杂的测试中失败了,您需要同时连接多个连接或暂停交易。我认为tcp based server mode中的h2也可以正常工作,但这可能不是内存中临时嵌入式数据库的最快通信模式。
有哪些可能性及其优点/缺点?另外,如何创建表/填充数据库?
更新:让我们指定一些对此类测试很重要的具体要求。
答案 0 :(得分:47)
由于我不知道是否有任何工具可以检查数据库,我认为一个简单的解决方案是使用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
扩展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数据库驱动程序添加到类路径中。
答案 1 :(得分:18)
我目前包含在仅测试的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>
创建/删除表可以在覆盖AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction时使用executeSqlScript,或者在适当的位置使用SimpleJdbcTestUtils.executeSqlScript。
还要比较this posting。
答案 2 :(得分:9)
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>
当Spring应用程序上下文关闭时,通过调用dispose方法关闭数据库。
答案 3 :(得分:0)