У меня были некоторые тесты JUnit, уже написанные в моем проекте, которые использовались для заполнения данных в методе установки. Теперь я добавил maven в свой проект, и я хочу выполнить все тестовые примеры из maven, используя mvn test. Проблема в том, что моя база данных не очищается после запуска каждого тестового класса. Мне нужно очистить HSQLDB после того, как запущены тестовые примеры каждого класса.
Как я могу стереть данные из моего HSQLDB после каждого теста?
Ответ 1
-
Вы можете очистить данные, отбросив схему. Схема по умолчанию называется PUBLIC. Если вы выполните SQL-заявку ниже, он очистит все данные и удалит все таблицы.
DROP SCHEMA PUBLIC CASCADE
-
В качестве альтернативы, если вам нужны определения объектов таблицы и схемы, вы можете создать файл: базу данных, содержащую объекты, но без данных, и добавить свойство ниже в файл .properties. Используя этот тип базы данных для тестов, изменения в данных не сохраняются
files_read_only = true
-
Последняя альтернатива, доступная в HSQLDB 2.2.6 и более поздних версиях, позволяет очищать все данные в схеме при сохранении таблиц. В приведенном ниже примере схема PUBLIC очищается.
ОБРАТНАЯ СВЯЗЬ TRUNCATE SCHEMA
Этот оператор был расширен в последних версиях HSQLDB. См. http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement в Заявление об усечении
Ответ 2
Следуя советам fredt, ИДЕНТИФИКАЦИЯ ПУБЛИЧНОЙ ОТСТАВКИ TRUNCATE SCHEMA И НЕ ПРОВЕРЯЙТЕ НЕТ ПРОВЕРКИ работал на меня. Соответствующая часть кода в тесте JUnit для DAO.
@After
public void tearDown() {
try {
clearDatabase();
} catch (Exception e) {
fail(e.getMessage());
}
}
public void clearDatabase() throws Exception {
DataSource ds = (DataSource) SpringApplicationContext.getBean("mydataSource");
Connection connection = null;
try {
connection = ds.getConnection();
try {
Statement stmt = connection.createStatement();
try {
stmt.execute("TRUNCATE SCHEMA PUBLIC RESTART IDENTITY AND COMMIT NO CHECK");
connection.commit();
} finally {
stmt.close();
}
} catch (SQLException e) {
connection.rollback();
throw new Exception(e);
}
} catch (SQLException e) {
throw new Exception(e);
} finally {
if (connection != null) {
connection.close();
}
}
}
Согласно документации на http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_truncate_statement
Если указана RESTART IDENTITY, все последовательности IDENTITY таблицы и все Объекты SEQUENCE в схеме reset к их начальным значениям
Ответ 3
Что мы делаем во всех наших тестах, так это то, что мы откатываем транзакцию в самом конце выполнения (после всех утверждений). Мы используем Spring, а тесты по умолчанию не фиксируются в самом конце. Это гарантирует, что вы всегда возвращаетесь к исходному состоянию базы данных (после первоначального создания таблиц сущностей и запуска import.sql).
Даже если вы не используете Spring, вы можете, вероятно, свернуть собственный блок try {} finally {}
, чтобы откат запущенной транзакции для каждого теста.
Ответ 4
Другое решение приведено в разделе "Очистка базы данных между тестами" http://www.objectpartners.com/2010/11/09/unit-testing-your-persistence-tier-code/
Ответ 5
У меня был простой SQL script, который запускался перед каждым тестом со следующей инструкцией в начале:
TRUNCATE SCHEMA public AND COMMIT;
но я столкнулся с проблемами блокировки между тестами и добавил, что это сработало для меня как шарм:
@After
public void after() throws Exception {
if (entityManager.getTransaction().isActive()) {
entityManager.getTransaction().rollback();
}
}