В моих модульных тестах используется Hibernate для подключения к базе данных HSQLDB в памяти. Я надеялся, что будет способ очистить и воссоздать базу данных (всю базу данных, включая схему и все данные) в методе TestCase.setUp()
от JUnit.Очистка всей базы данных (для модульного тестирования с использованием 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 будет закрыта явно.
например. Проверить | обновление | создать | create-drop
Если вам не нравится иметь эту конфигурацию в вашей реальной конфигурации спящего режима, вы можете создать одну конфигурацию спящего режима для целей единичного тестирования.
Это только воссоздает его каждый запуск. Это означает, что если вы запускаете свои тесты из eclipse, многие не смогут пройти, если они будут выполняться в одиночку. По крайней мере, это мой опыт. –
hibernate.hbm2ddl.auto=create-drop
И загрузочный новый SessionFactory
.
как это делается при использовании только JPA? – Konsumierer
Если вы используете Spring, вы можете использовать атрибут @Transactional в своем модульном тесте, и по умолчанию в конце каждого модульного теста все сохраненные данные будут автоматически откатываться назад, поэтому вам не нужно беспокоиться о том, чтобы сбросить таблицы каждый раз.
Я Хаа шел через в качестве примера здесь http://automateddeveloper.blogspot.com/2011/05/hibernate-spring-testing-dao-layer-with.html
С тестирования точки зрения, лучшая практика для очистки данных после каждого теста. Если вы используете create-drop, он также потеряет схему таблицы. Это приводит к накладным расходам на воссоздание схемы каждый раз.
Поскольку вы используете hsql, который предоставляет прямой механизм для усечения, в этом случае это лучший вариант.
@After
public void clearDataFromDatabase() {
//Start transaction, based on your transaction manager
dao.executeNativeQuery("TRUNCATE SCHEMA PUBLIC AND COMMIT");
//Commit transaction
}
Будьте осторожны с протирания мир и начать над свежим каждый раз. Вскоре вы, скорее всего, захотите начать с «стандартного» набора тестовых данных, загруженных в вашу систему. Таким образом, вам действительно нужно вернуться к этому базовому состоянию до запуска каждого теста. В этом случае вам нужно выполнить транзакцию , которая выполняет 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() {
...
}
Если вы тестируете DB, то имо это не является модульным тестированием. – Jamie
Я тестирую свою программу, которая используется для использования базы данных. –
Я тестирую класс, который используется для доступа к данным в базе данных – Lu55