春季测试:数据库在测试中初始化了两次

时间:2018-11-29 11:59:18

标签: java spring spring-jdbc spring-test

我遇到的问题

添加了附加测试(应使用@ActiveProfiles)后,我得到了例外,当database-schema.sql脚本在同一数据库上运行两次时,就会出现这种情况。

我使用什么框架

  • spring:3.2.13.Releasespring-data-jpa:1.6.5.RELEASEhsqldb:2.3.2hibernate-entitymanager:4.3.1.FINAL
  • junit:4.12spring-test:3.2.13.RELEASE

我在代码/测试中使用什么

  • 要创建数据源,我在<jdbc:embedded-database id="dataSource">中使用.../test/resources/spring/testConfig.xml
  • @RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration(locations = {"classpath:spring/testConfig.xml"})用于我的两个测试
  • 使用@ActiveProfiles进行的测试扩展了另一个测试<-我检查了是否是问题here的问题,但不是。

我的猜想

在添加@ActiveProfiles之后,必须重新创建春季竞赛,因为还有其他bean或其他设置取决于活动概要文件。但是似乎数据库没有删除。

我不想要的东西

我不想将schema.sql文件更改为

create table exampleModel if not exists 

因为此脚本是定期自动生成的,并且在我的生产环境中,有许多自定义类型和表格,所以我不想手动对其进行编辑。

我想要的东西

数据库的重用(因此没有为每个测试初始化​​数据库)

繁殖方式

  1. 结帐my github-repo

  2. mvn test中运行./test/

异常

java.lang.IllegalStateException: Failed to load ApplicationContext
...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [spring/testConfig.xml]: Cannot resolve reference to bean 'dataSource' while setting bean property 'dataSource'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource': Invocation of init method failed; nested exception is org.springframework.dao.DataAccessResourceFailureException: Failed to execute database script; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement at line 1 of resource class path resource [testDB/schema.sql]: CREATE TYPE TEXT AS VARCHAR(1000000)
...
Caused by: java.sql.SQLSyntaxErrorException: object name already exists: TEXT in statement [CREATE TYPE TEXT AS VARCHAR(1000000)]
...
Caused by: org.hsqldb.HsqlException: object name already exists: TEXT

2 个答案:

答案 0 :(得分:0)

要重用数据库架构,可以将hibernate.hbm2ddl.auto(在testConfig.xml中)的值更改为update。参见:this

答案 1 :(得分:0)

按如下所示修改您的jdbc:embedded-database标签:

<jdbc:embedded-database id="dataSource" generate-name="true">

有关更多详细信息,请参见与embedded database support相关的Spring文档。