2010-09-05 2 views
6

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

+3

Если вы тестируете DB, то имо это не является модульным тестированием. – Jamie

+0

Я тестирую свою программу, которая используется для использования базы данных. –

+0

Я тестирую класс, который используется для доступа к данным в базе данных – Lu55

ответ

7

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

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

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

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

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

+3

Это только воссоздает его каждый запуск. Это означает, что если вы запускаете свои тесты из eclipse, многие не смогут пройти, если они будут выполняться в одиночку. По крайней мере, это мой опыт. –

2
hibernate.hbm2ddl.auto=create-drop 

И загрузочный новый SessionFactory.

+2

как это делается при использовании только JPA? – Konsumierer

2

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

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

0

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

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


@After 
public void clearDataFromDatabase() { 
    //Start transaction, based on your transaction manager 
    dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT"); 
    //Commit transaction 
} 
1

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

Для достижения этой цели, вы должны аннотировать класс 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() { 
    ... 
}