HSQLDB + junit:间歇性"连接异常:已关闭"

时间:2017-11-24 17:16:04

标签: java unit-testing junit hsqldb maven-surefire-plugin

我在单元测试中使用HSQLDB时遇到一个奇怪的问题。

我使用内存中的HSQLDB进行单元测试,该测试间歇性地失败,具有以下内容:

org.hsqldb.HsqlException: connection exception: closed

一起
org.hsqldb.HsqlException: connection exception: connection does not exist

我怀疑内存数据库在不同的测试运行之间存在某种程度。

我的测试看起来像这样:

private static final String DRIVER = "org.hsqldb.jdbc.JDBCDriver";
private static final String URL = "jdbc:hsqldb:mem:test2";

@BeforeClass
public static void init() throws SQLException, ClassNotFoundException, IOException {
    Class.forName(DRIVER);
    populateDatabase();
}

private static Connection getConnection() throws SQLException {
    return DriverManager.getConnection(URL, user, user);
}

private static void populateDatabase() throws SQLException {
    try (Connection connection = getConnection(); Statement statement = connection
            .createStatement()) {
        statement.execute(
                "CREATE TABLE employee (name VARCHAR(50) NOT NULL, "
                        + " age INT NOT NULL, outputcol FLOAT)");
        connection.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@AfterClass
public static void destroy() throws SQLException, ClassNotFoundException, IOException {
    try (Connection connection = DriverManager
            .getConnection(URL + ";shutdown=true", user, user);
            Statement statement = connection.createStatement()) {
        statement.executeUpdate("DROP TABLE employee");
        connection.commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

错误不一致的事实表明测试运行之间存在于内存中的事情,这很奇怪。

我试过了:

  • 添加' shutdown = true' destroy方法的选项
  • 使每个类中的URL名称不同
  • 使用@After和@AfterClass清理连接
  • 每次运行测试时更改hsqldb的名称

请注意,测试应在内存中创建数据库,然后将凭据传递给测试中的类,该类使用这些凭据通过DriverManager进行连接。测试结束后,我们放弃表格,基本上想要清空并销毁数据库。

我正在使用mvn clean install从命令行运行这些测试。

1 个答案:

答案 0 :(得分:0)

添加到URL的;shutdown=true语义如下:

  • 它在第一次连接数据库时有效,而不是在后续连接上有效

  • 当最后一个连接关闭时(通过调用close()方法),数据库也会关闭

您可以在destroy()方法中执行SHUTDOWN作为SQL语句,而不是依赖于所有关闭的连接。