我正在使用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:test阶段运行的单元测试中,我用该url实例化了一个数据源。
org.hsqldb.jdbc.JDBCDataSource ds = new JDBCDataSource();
ds.setUrl(URL);
ds.setUser("sa");
ds.setPassword("");但是这里没有我通过脚本初始化的表。事实证明,surefire会派生一个新的jvm,并且无法从那里访问启动的原始hsql实例。有没有不引入文件备份hsqldb的解决方案?
谢谢
发布于 2013-10-05 04:49:46
你可以试试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之类的框架。
发布于 2013-08-05 16:45:44
你有没有考虑过使用dbunit?这也将使从IDE运行单元测试变得更加容易,而不需要Maven或执行其所有的测试前阶段。
另外,对于单元测试,是否需要使用数据库?您不应该测试是否可以建立数据库连接。相反,我更喜欢用mockito之类的东西来模拟这样的对象。它是关于为某个sql语句指定您想要的结果。
https://stackoverflow.com/questions/18053787
复制相似问题