首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于单元测试的hsql

用于单元测试的hsql
EN

Stack Overflow用户
提问于 2013-08-05 16:35:55
回答 2查看 2.8K关注 0票数 0

我正在使用sql-maven-plugin为单元测试设置内存中的hsql数据库。

代码语言:javascript
复制
        <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实例化了一个数据源。

代码语言:javascript
复制
            org.hsqldb.jdbc.JDBCDataSource ds = new JDBCDataSource();
            ds.setUrl(URL);
            ds.setUser("sa");
            ds.setPassword("");

但是这里没有我通过脚本初始化的表。事实证明,surefire会派生一个新的jvm,并且无法从那里访问启动的原始hsql实例。有没有不引入文件备份hsqldb的解决方案?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-10-05 04:49:46

你可以试试turning off forking in surefire

代码语言:javascript
复制
      <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:

代码语言:javascript
复制
@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
EN

Stack Overflow用户

发布于 2013-08-05 16:45:44

你有没有考虑过使用dbunit?这也将使从IDE运行单元测试变得更加容易,而不需要Maven或执行其所有的测试前阶段。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18053787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档