Очистка всей базы данных (для модульного тестирования в Hibernate) - PullRequest
7 голосов
/ 05 сентября 2010

Мои модульные тесты используют Hibernate для подключения к базе данных HSQLDB в памяти.Я надеялся, что будет способ очистить и восстановить базу данных (всю базу данных, включая схему и все данные) в методе TestCase.setUp() JUnit.

Ответы [ 5 ]

7 голосов
/ 05 сентября 2010

вы можете сконфигурировать ваш файл конфигурации hibernate, чтобы база данных каждый раз заново создавала ваши таблицы и схему.

<!-- Drop and re-create the database schema on startup -->
<property name="hbm2ddl.auto">create-drop</property>

hibernate.hbm2ddl.auto Автоматически проверяет или экспортирует DDL схемы в базу данных при создании SessionFactory,С помощью create-drop схема базы данных будет отброшена, когда SessionFactory закрывается явно.

например, validate |обновление |создать |create-drop

если вы не хотите, чтобы этот конфиг был в вашей реальной конфигурации hibernate, вы можете создать одну конфигурацию hibernate для целей модульного тестирования.

3 голосов
/ 22 мая 2011

Если вы используете Spring, то вы можете использовать атрибут @Transactional в своем модульном тесте, и по умолчанию в конце каждого модульного теста все сохраненные данные будут автоматически откатываться, поэтому вам не нужно беспокоиться об удалении таблиц. каждый раз.

Я прошел здесь пример http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html

2 голосов
/ 05 сентября 2010
hibernate.hbm2ddl.auto=create-drop

И загрузи новую SessionFactory.

1 голос
/ 23 января 2015

Будьте осторожны, вытирая мир и начинайте каждый раз заново. Вскоре вы, вероятно, захотите начать с набора тестовых данных по умолчанию, загруженных в вашу систему. Таким образом, вам действительно нужно вернуться в это базовое состояние перед каждым тестом. В этом случае вам нужна транзакция , которая откатывается перед каждым запуском теста.

Для этого вы должны аннотировать свой класс JUnit:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:/path/to/spring-config.xml"})
@TransactionConfiguration(transactionManager="myTransactionManager", defaultRollback=true)
public class MyUnitTestClass {
...
}

А затем аннотируйте каждый из ваших методов тестирования с помощью @Transactional:

@Transactional
@Test
public void myTest() {
    ...
}
1 голос
/ 14 ноября 2014

С точки зрения тестирования, лучшая практика - очищать данные после каждого теста.Если вы используете create-drop, он также удалит схему таблицы.Это приводит к накладным расходам на воссоздание схемы каждый раз.

Поскольку вы используете hsql, который обеспечивает прямой механизм усечения, это будет лучшим вариантом в этом случае.


@After
public void clearDataFromDatabase() {
    //Start transaction, based on your transaction manager
    dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT"); 
    //Commit transaction
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...