2010-07-15 1 views
1

У меня есть 2 тестовые классы, как аннотированный с unitils аннотацийЗагрузка наборов данных в последовательных тестах завершается с «закрытой сессии»

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

Целевая база данных является HSQLDB, который инициируется в реферате метод суперкласса аннотированный с TestNG аннотацию:

@BeforeClass 

Когда TestRunner (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 в первом классе тест, но не во втором.

Есть ли у кого-нибудь ключ?

Спасибо! Дж

ответ

1

следующие проясняет/ответы проблемы:

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

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

И, в способе демонтажа @AfterClass дБ был удален в явном виде:

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

Воссоздание базы данных не является большой проблемой, если ... DBUnit содержит ссылку на соединение с базой данных и ожидает продолжения работы над одной и той же базы данных в каждом TestCase.

выключение = истина Модификатор соединение помогло ...

=> Fix:

(1) Удалите @AfterClass логика: не закрыли базу данных Явно

(2) Сорвите базу данных декларативно путем добавления выключение = 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)

Смежные вопросы