Unit testing 在连续测试中加载数据集失败,返回“0”;“非公开会议”;
我有两个测试类,都用unitils注释Unit testing 在连续测试中加载数据集失败,返回“0”;“非公开会议”;,unit-testing,hsqldb,testng,dbunit,Unit Testing,Hsqldb,Testng,Dbunit,我有两个测试类,都用unitils注释 @DataSet("/dbunit-dataset.xml") 目标数据库是一个HSQLDB,它由一个抽象超类方法启动,该方法用testng注释进行注释: @BeforeClass 当testrunner(MavenSurefire)到达第二个测试时,数据库被正确实例化(我可以在日志中看到),但是unitils,或者实际上是dbunit,无法加载数据集 Caused by: org.unitils.core.UnitilsException: Erro
@DataSet("/dbunit-dataset.xml")
目标数据库是一个HSQLDB,它由一个抽象超类方法启动,该方法用testng注释进行注释:
@BeforeClass
当testrunner(MavenSurefire)到达第二个测试时,数据库被正确实例化(我可以在日志中看到),但是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.以下内容澄清/回答了该问题: 在@BeforeClass设置方法中,通过打开与每个类的连接,为每个类重新创建HSQLDB实例:
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:unit-testing-jpa", "sa","");
并且,在@AfterClass拆卸方法中,db被明确删除:
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在最后一个连接关闭时自动关闭。(另请参见:)以下内容澄清/回答了该问题: 在@BeforeClass设置方法中,通过打开与每个类的连接,为每个类重新创建HSQLDB实例:
Class.forName("org.hsqldb.jdbcDriver");
connection = DriverManager.getConnection("jdbc:hsqldb:mem:unit-testing-jpa", "sa","");
并且,在@AfterClass拆卸方法中,db被明确删除:
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在最后一个连接关闭时自动关闭。(另见:)