Создать схему базы данных (Hibernate) в тесте maven
Я (через некоторое время, не касаясь JPA) начал проект с Hibernate 4.1, JPA2 и Spring. Это проект Maven с общим жизненным циклом.
После запуска mvn test я получаю ожидаемый результат, не найдя требуемые объекты базы данных (соединение успешно, как и ожидалось). Однако все мои исследования и эксперименты оказались недостаточными для создания чего-то, что казалось обычной ситуацией.
Я ожидаю, что у меня будет возможность создать / удалить схему в локальной базе данных разработки при выполнении модульных тестов; Я предполагал, что hibernate3-maven-plugin (в идеале версия 3.0) должен справиться с этим, но мне не удалось заставить его работать. Я не ожидаю какой-либо автоматической вставки данных (для этого я мог бы использовать DBUnit или даже лучше, чтобы каждый тест генерировал свои собственные тестовые данные, но здесь это не играет никакой роли), но я ожидаю, что схема будет обновлена в тестовой базе данных, отражая текущее состояние моих аннотированных моделей классов. Я предполагаю, что это будет связано с фазой процесса-тестирования-ресурсов.
Я ожидаю сгенерировать (или набор) sql-файлов с (текущим) определением схемы, но лучший результат, который я получил, отражает проблему, описанную здесь: Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl завершается с ошибкой по причине "Вызвано: java.lang.NullPointerException " (решения пока нет).
Я что-то упускаю глупо или это действительно невозможно в это время? Я был бы очень рад, если бы кто-то мог предоставить мне любой из
надлежащая документация о том, как это должно быть достигнуто
рабочий пример использования hibernate 4
любые практические рекомендации по достижению моих целей с помощью другой стратегии.
Если это имеет какое-либо отношение, база данных Postgres 9.1.
Заранее спасибо.
2 ответа
Снова ответ на мой собственный вопрос.
Чтобы добиться желаемого результата, мне пришлось в maven выполнить цепочку выполнения hbm2ddl hibernate3-maven-plugin на фазе классов процессов с другим выполнением sql-maven-plugin на фазе process-test-resources. Первый генерирует sql для модели Hibernate, а второй применяет его к базе данных.
Оглядываясь назад, кажется, на самом деле достойное и чистое решение.
Мне все еще интересно узнать лучшие практики, если они отличаются от моего решения, для достижения цели создания базы данных для тестирования с помощью maven из модели Hibernate.
Один из способов сделать это - использовать Arquillian. Вы можете создать отдельный пакет развертывания для каждого теста или для набора тестов со своим собственным persistence.xml
и источники данных. Использовать hbm2dll
установка в persistence.xml
либо создать-удалить или обновить схему:
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
Если вы хотите предварительно заполнить базу данных, вы можете добавить import.sql
к вашему развертыванию, которое будет выполнено hibernate при запуске приложения, или используйте расширение Arquillian Persistence.
Вот полная настройка теста arquillian в качестве примера:
@RunWith(Arquillian.class)
public class MyTest {
@Deployment
public static Archive<?> createTestArchive() {
return ShrinkWrap.create(WebArchive.class, "myTest.war")
.addPackages(true, "com.example")
.addAsResource("testSeeds/seed.sql", "import.sql")
.addAsResource("in-mem-persistence.xml", "META-INF/persistence.xml")
.addAsWebInfResource("in-mem-datasource.xml");
}
Недостатком является то, что тесты в контейнере будут медленнее, чем простые модульные тесты.
Я не уверен, насколько хорошо Arquillian может хорошо играть со Spring, я использовал его только для приложений Java EE, поэтому, пожалуйста, скажите, поможет ли он.