1

2つのテストクラスがあり、どちらもunitilsアノテーションが付けられています

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

ターゲットデータベースはHSQLDBであり、 testngアノテーションが付けられた抽象スーパークラスメソッドで開始されます。

@BeforeClass

テストランナー(Maven Surefire)が2番目のテストに到着すると、データベースは正しくインスタンス化されますが(ログで確認できます)、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に接続できるのに、2番目のテストクラスでは接続できない理由に戸惑います。

enybodyには手がかりがありますか?

ありがとうございました!J。

4

1 に答える 1

1

以下は、問題を明確にし、答えます。

@BeforeClassセットアップメソッドでは、HSQLDBインスタンスへの接続を開くことにより、クラスごとに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が自動的に閉じられます。
(参照: http: //hsqldb.org/doc/guide/ch04.html

于 2010-07-15T15:21:59.513 に答える