Загрузка наборов данных в последовательных тестах завершается неудачно с «закрытой сессией» - PullRequest
1 голос
/ 15 июля 2010

У меня есть 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 в первом тестовом классе, но не во втором.

Есть ли у кого-нибудь подсказка?

Спасибо! J.

1 Ответ

1 голос
/ 15 июля 2010

Следующее разъясняет / отвечает на проблему:

В методе установки @ BeforeClass экземпляр HSQLDB был воссоздан для каждого класса , открыв соединение сit:

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)

...