用于测试的嵌入式H2数据库的Spring配置

Han*_*örr 41 spring unit-testing h2 embedded-database

对于集成测试,您的Spring配置与使用嵌入式h2数据源以及可选的JUnit 相似?

我第一次尝试使用SingleConnectionDataSource基本上可以工作,但是在更复杂的测试中失败了,你需要同时连接多个连接或挂起事务.我认为基于tcp的服务器模式中的 h2 也可以正常工作,但这可能不是内存中临时嵌入式数据库的最快通信模式.

有哪些可能性及其优点/缺点?另外,如何创建表/填充数据库?


更新:让我们指定一些对此类测试很重要的具体要求.

  • 数据库应该是临时的并且在内存中
  • 对于速度要求,连接可能不应使用tcp
  • 如果我可以使用数据库工具在调试期间检查数据库的内容,那将是很好的
  • 我们必须定义数据源,因为我们不能在单元测试中使用应用程序服务器数据源

mat*_*sev 49

由于我不知道是否有任何工具可以检查数据库,我认为一个简单的解决方案是使用支持HSQL,H2和Derby 的Spring嵌入式数据库(3.1.x docs,当前文档) .

使用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>
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢基于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();
}
Run Code Online (Sandbox Code Playgroud)

数据库表由db-schema.sql脚本创建,并使用db-test-data.sql脚本中的测试数据填充它们.

不要忘记将H2数据库驱动程序添加到类路径中.


Han*_*örr 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>
Run Code Online (Sandbox Code Playgroud)

在重写AbstractAnnotationAwareTransactionalTests.onSetUpBeforeTransaction时,可以使用executeSqlScript创建/删除表,也可以在适当的位置使用SimpleJdbcTestUtils.executeSqlScript.

比较这个帖子.


ejb*_*boy 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> 
Run Code Online (Sandbox Code Playgroud)

当Spring应用程序上下文关闭时,通过调用dispose方法关闭数据库.