2013-02-14 3 views
1

I (через некоторое время без касания JPA) начал проект с Hibernate 4.1, JPA2 и Spring. Это проект maven с общим жизненным циклом.Создание схемы базы данных (Hibernate) на тест maven

При запуске теста mvn я получаю ожидаемый результат не отыскания требуемых объектов базы данных (соединение выполняется, как ожидалось). Однако все мои исследования и эксперименты оказались недостаточными, чтобы сделать что-то вроде обычной ситуации.

  • Я ожидаю, что у меня будет возможность отклонить/создать схему локальной базы данных разработки при выполнении модульных тестов; Я представил себе, что hibernate3-maven-plugin (версия 3.0 идеально) должен справиться с этим, но мне не удалось заставить его работать. Я не ожидаю автоматической вставки данных (для этого я мог бы использовать DBUnit или даже лучше, чтобы каждый тест генерировал собственные тестовые данные, но это не играет никакой роли здесь), но я ожидаю, что схема будет обновлена ​​в тестовой базе данных, отражающие текущее состояние моих аннотированных классов моделей. Я полагаю, что это будет связано с фазой process-test-resources.

  • Я ожидаю сгенерировать (или набор) sql-файл с определением схемы (текущей), но лучший результат, который я получил, отражает проблему, описанную здесь: Maven + Spring + Hibernate: hibernate3-maven-plugin hbm2ddl fails for reason "Caused by: java.lang.NullPointerException" (пока нет решения).

Я пропустил что-то глупое или это действительно невозможно в это время? Я был бы очень рад, если кто-то может дать мне какие-либо из

  • надлежащей документации о том, как это должно быть достигнуто

  • в рабочий пример, используя спящий режим 4

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

Если это имеет значение, база данных Postgres 9.1.

Заранее спасибо.

ответ

0

Опять ответ на мой вопрос.

Чтобы достичь результата, я хотел, чтобы мне пришлось с помощью maven выполнить hbm2ddl hibernate3-maven-plugin на фазе классов процессов с еще одним выполнением sql-maven-plugin на этапе process-test-resources. Первый создает sql для модели Hibernate, а второй применяет ее к базе данных.

Оглядываясь назад, кажется, что это действительно приличное и чистое решение.

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

2

Один из способов сделать это - использовать Arquillian. Вы можете создать отдельный пакет развертывания для каждого теста или для набора тестов, с его собственными persistence.xml и источниками данных. Используйте параметр hbm2dll в persistence.xml либо создать падение или обновить схему:

<property name="hibernate.hbm2ddl.auto" value="create-drop" /> 

Если вы хотите предварительно заполнить базу данных, вы можете либо добавить import.sql к развертыванию, которое будет выполняться с помощью спящего режима при запуске приложения , или используйте Arquillian Persistence extension.

Вот полный 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, поэтому, пожалуйста, сообщите, если это поможет.