Создать схему базы данных (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, поэтому, пожалуйста, скажите, поможет ли он.

Другие вопросы по тегам