0

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

谢谢

4

2 回答 2

1

您可以尝试在 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-10-04T20:49:45.823 回答
0

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

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

于 2013-08-05T08:45:43.890 回答