【问题标题】:hsql for unit tests maven用于单元测试的 hsql
【发布时间】:2013-08-05 21:38:42
【问题描述】:

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

谢谢

【问题讨论】:

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


    【解决方案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 等框架。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢您的建议,但我需要的是某种 sql 有效性检查。我有很多动态构建的 sql(很多 StringBuilder.appends),并且想通过针对 db 运行来检查生成的 sql 的有效性。我认为 dbunit 可以简化表/结果集比较,但在这种情况下也有帮助吗?
      • 对 StringBuilder.appends 非常非常小心,您可能会引入 SQL 注入选项 (owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet)。 DBUnit 通常用于使数据库处于某种状态(预填充表),因此您可以像使用生产数据库一样轻松地进行测试。 dbunit.sourceforge.net/howto.html
      猜你喜欢
      • 2011-12-10
      • 2012-07-31
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 2013-04-09
      • 2018-07-16
      • 2012-01-13
      • 1970-01-01
      相关资源
      最近更新 更多