用于testing的embedded式H2数据库的弹簧configuration

你的Spring集成testingconfiguration看起来像使用embedded式h2数据源和JUnit(可选)?

我第一次尝试SingleConnectionDataSource基本上工作,但在更复杂的testing失败,你需要在同一时间几个连接或暂停交易。 我认为基于TCP的服务器模式下的 h2也可能工作,但这可能不是用于内存中临时embedded式数据库的最快通信模式。

有什么可能性和它们的优点/缺点? 另外,你如何创build表/填充数据库?


更新:让我们指定一些对这些testing非常重要的具体要求。

  • 数据库应该是临时的,并在内存中
  • 对于速度要求,连接可能不应该使用tcp
  • 如果我可以使用数据库工具在debugging过程中检查数据库的内容,那将会很好
  • 我们必须定义一个数据源,因为我们不能在unit testing中使用应用程序服务器数据源

有了保留,我不知道是否有任何工具可以检查数据库,我认为一个简单的解决scheme是使用Springembedded式数据库( 3.1.x文档 , 当前文档 ),它支持HSQL,H2和德比。

使用H2,你的XMLconfiguration如下所示:

<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的configuration,你可以像这样实例化一个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脚本创build,并使用db-test-data.sql脚本中的testing数据填充。

不要忘记将H2数据库驱动程序添加到类path中。

我目前在testingspringconfig文件中包含一个数据源:

 <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时 ,或者在适当的位置使用SimpleJdbcTestUtils.executeSqlScript ,创build/删除表可以通过使用executeSqlScript来完成。

比较这个post 。

H2与一个内置的连接池实现捆绑在一起。 下面的XML提供了一个使用它作为Datasource 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应用程序上下文closures时,数据库将通过调用dispose方法来closures。

我认为最好使用您的生产DataSource实现(仅用于不同的连接string)进行unit testing。

无论如何,“更复杂的testing失败”并不能提供足够的信息以获得更详细的答案。

(自我广告: 检查这个 )