1

我有 2 个测试类,都用unitils注释进行了注释

@DataSet("/dbunit-dataset.xml")

目标数据库是一个HSQLDB,它在一个带有testng注释的抽象超类方法中启动:

@BeforeClass

当测试运行程序(Maven Surefire)到达第二次测试时,数据库已正确实例化(我可以在日志中看到),但unitils或实际上dbunit无法加载数据集。

Caused by: org.unitils.core.UnitilsException: Error while executing DataSetLoadStrategy
        at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:48)
        at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:230)
        at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:153)
        ... 34 more
Caused by: java.sql.SQLException: Access is denied: Session is closed
        at org.hsqldb.jdbc.Util.throwError(Unknown Source)
        at org.hsqldb.jdbc.jdbcStatement.executeBatch(Unknown Source)
        at org.dbunit.database.statement.BatchStatement.executeBatch(BatchStatement.java:59)
        at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:126)
        at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
        at org.unitils.dbunit.datasetloadstrategy.impl.CleanInsertLoadStrategy.doExecute(CleanInsertLoadStrategy.java:45)
        at org.unitils.dbunit.datasetloadstrategy.impl.BaseDataSetLoadStrategy.execute(BaseDataSetLoadStrategy.java:44)
        ... 36 more

我很困惑为什么dbunit设法在第一个测试类中连接到HSQLDB,而在第二个测试类中却没有。

有人有线索吗?

谢谢!J。

4

1 回答 1

1

以下澄清/回答了问题:

@BeforeClass设置方法中,通过打开到它的连接,为每个类重新创建了 HSQLDB 实例:

Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:unit-testing-jpa", "sa","");

并且,在@AfterClass拆解方法中,数据库被显式删除:

connection.createStatement().execute("SHUTDOWN");

重新创建数据库不是一个大问题,除非... DBUnit 持有对数据库连接的引用,并希望在每个测试用例中继续在同一个数据库上工作。

shutdown=true连接修饰符有很大帮助...

=> 修复:

(1) 去掉@AfterClass逻辑:不要显式关闭数据库

(2) 通过在初始连接中添加shutdown=true以声明方式拆除数据库

Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:unit-testing-jpa;shutdown=true", "sa","");

这将使 HSQLDB 在最后一个连接关闭时自行关闭。
(另见:http: //hsqldb.org/doc/guide/ch04.html

于 2010-07-15T15:21:59.513 回答