我正在使用sql-maven-plugin在内存中设置hsql数据库以进行单元测试
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>sql-maven-plugin</artifactId>
<version>1.5</version>
<dependencies>
<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>2.2.8</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>create-db</id>
<phase>process-test-resources</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<driver>org.hsqldb.jdbcDriver</driver>
<url>jdbc:hsqldb:mem:test;shutdown=false</url>
<username>SA</username>
<password></password>
<autocommit>true</autocommit>
<srcFiles>
<srcFile>src/test/sql/test_db/test.sql</srcFile>
</srcFiles>
</configuration>
</execution>
</executions>
</plugin>
在maven中运行的单元测试:测试阶段,我用该url实例化数据源
org.hsqldb.jdbc.JDBCDataSource ds = new JDBCDataSource();
ds.setUrl(URL);
ds.setUser("sa");
ds.setPassword("");
但是这没有我通过脚本初始化的表。事实证明,surefire分配一个新的jvm并且从那里无法访问原始的hsql实例。有没有引入文件支持的hsqldb的解决方案?
由于
答案 0 :(得分:1)
您可以尝试turning off forking in surefire。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<forkCount>0</forkCount>
</configuration>
</plugin>
或者,您可以直接在单元测试环境中实例化HSQL服务器,以便在分叉的Surefire JVM中生成HSQL:
@BeforeClass
public static void oneTime() throws Exception {
org.hsqldb.Server.main(new String[]{});
}
@AfterClass
public static void oneTime() throws Exception {
BasicDataSource dataSource = ... // get your data source
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.execute("SHUTDOWN");
}
如果在测试类之后没有关闭HSQL,那么在尝试为每个测试类生成新的数据库服务器时,您将遇到“已在使用的端口”类型错误。
或者,你可以使用像Hibernate或DbUnit这样的框架。
答案 1 :(得分:0)