hsql用于单元测试maven

时间:2013-08-05 08:35:55

标签: maven unit-testing hsqldb in-memory-database sql-maven-plugin

我正在使用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的解决方案?

由于

2 个答案:

答案 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)

您是否考虑过使用dbunit?这也将使得从IDE运行单元测试变得更加容易,而无需Maven或执行所有预测试阶段。

另外,对于单元测试是否需要使用数据库?您不应该测试是否可以建立数据库连接。相反,我更喜欢使用类似mockito的东西来模拟这些对象。它是关于为某个sql语句指定所需的结果。