#hibernate #maven-2 #orm #jpa
#переход в спящий режим #maven-2 #orm #jpa
Вопрос:
Я пишу веб-приложение, и мне интересно, какой рекомендуемый способ заполнения исходных данных. Это приложение JPA / Hibernate и Spring, созданное maven. До сих пор я использовал скрипт, который заполняет базу данных исходными данными, запущенный вручную.
Модульные тесты работают со своими собственными данными, созданными в коде перед каждым тестированием. Мои тестовые классы расширяют org.springframework.test.jpa.AbstractJpaTests.
Наконец, я хотел бы иметь сборку maven, которая создает объекты формы базы данных (теперь мне нужно запустить приложение в первый раз, чтобы создать базу данных, затем запустить скрипт), затем заполняет исходные данные / словарь и запускает модульные и интеграционные тесты. Этот процесс должен быть полностью автоматизирован, чтобы поместить эту сборку на CI server (hudson), создание новой базы данных с нуля также приветствуется.
Дополнительное требование: решение, не зависящее от базы данных, будет наиболее ценным.
РЕДАКТИРОВАТЬ: Лучший пример того, что я ищу, — это закрытие инициализации в BootStrap.groovy.
Ответ №1:
РЕДАКТИРОВАТЬ: Добавлена ссылка на сообщение в блоге, показывающее, как протестировать Hibernate JPA с помощью Spring и DBUnit.
[…] Я хотел бы иметь сборку maven, которая создает базу данных из объектов
Существует плагин maven hibernate3 с целью hibernate3: hbm2ddl, который может помочь. В сочетании с плагином maven sql должно быть возможно создать эту схему из сгенерированного DDL.
[…] затем заполняет исходные данные / словарь
Опять же, плагин maven sql мог бы выполнить эту работу здесь. Или, может быть, с помощью DBUnit, что является другим элегантным решением (см. Плагин maven dbunit).
и запустить модульные и интеграционные тесты.
Ну, я не уверен, что ваши модульные тесты должны обращаться к базе данных, но для тестов интеграции проверьте DBUnit, как я уже сказал. Это действительно очень хороший инструмент, который позволяет вам настроить базу данных в известном состоянии, протестировать таблицы на предмет ожидаемого содержимого после выполнения теста и вернуть базу данных в исходное состояние. Хороший пример см. в разделе Тестирование JPA Hibernate с помощью Spring и DBUnit.
Этот процесс должен быть полностью автоматизирован, чтобы поместить эту сборку на CI server (hudson), создание новой базы данных с нуля также приветствуется.
Я думаю, что это возможно.
Комментарии:
1. Я рассматриваю возможность использования Unitils для моего модульного теста. Мне интересно, есть ли способ определить исходные данные в файле script / xml, прочитать их в java и перенести, используя JPA / Hibernate, независимо от базы данных.
2. Проверьте DBUnit, это то, что вы ищете, за исключением того, что оно не основано на JPA. DBUnit и его API позволяют определять исходные и ожидаемые данные в xml / csv, загружать их из модульных тестов, выполнять assert для содержимого таблицы, восстанавливать базу данных в исходном состоянии. И существует интеграция между DBUnit и Unitils (см. unitils.org/apidocs/org/unitils/dbunit/package-summary.html )
Ответ №2:
@David, спасибо за твой пост. Единственное разумное решение, которое я нашел для заполнения исходных данных, похоже на ваше — это вставка данных в тесты. В моем коде я даже не использую hibernate3-maven-plugin. Создание базы данных выполняется Spring в файле jpaContext.xml
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="true" />
<property name="generateDdl" value="true" />
<property name="databasePlatform" value="org.hibernate.dialect.HSQLDialect"/>
</bean>
</property>
<property name="dataSource" ref="dataSource"/>
Как я уже писал, я использую org.springframework.test.jpa.AbstractJpaTests с переопределенным методом
@Override
protected String[] getConfigLocations() {
return new String[]{
"classpath:/jpaContext.xml"};
}
Я думаю, это упростит ваше решение. Я все еще ищу лучшее разрешение для создания исходных данных. Создание объектов с большим количеством связей вручную является громоздким.
Комментарии:
1. Есть отрицательные отзывы о DBUnit (просто интересно, читаете ли вы мои ответы и / или комментарии)?
2. @Pascal. Почему отрицательный? 🙂 Я прочитал ваши комментарии / ответы. Наиболее предпочтительным решением для меня является настройка (я все еще ищу, как) способа JPA / Hibernate. Unitils / DBUnit — еще один хороший вариант, но уже второй.
Ответ №3:
Я решил проблему, почти идентичную вашей, расширив
org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests
Затем я использовал hibernate3-maven-plugin для заполнения базы данных (я использовал hsqldb) во время тестирования:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>hibernate3-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<components>
<component>
<name>hbm2ddl</name>
<implementation>jpaconfiguration</implementation>
</component>
</components>
<componentProperties>
<drop>true</drop>
<jdk5>true</jdk5>
<propertyfile>target/classes/jdbc.properties</propertyfile>
<skip>${maven.test.skip}</skip>
</componentProperties>
</configuration>
<executions>
<execution>
<phase>process-test-resources</phase>
<goals>
<goal>hbm2ddl</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>${jdbc.groupId}</groupId>
<artifactId>${jdbc.artifactId}</artifactId>
<version>${jdbc.version}</version>
</dependency>
</dependencies>
</plugin>
Я опубликовал простой проект maven в Google Code, чтобы продемонстрировать технику.
Комментарии:
1. У меня нет никаких технических причин для отказа от использования DBUnit. Я просто не использовал это. Я посмотрю на это и соответствующим образом обновлю свой пример проекта. К этому моменту я создал тестовые данные в коде. Это разумно для примера проекта, но когда дело доходит до тестирования реального кода, потребуется решение, подобное DBUnit. Спасибо за ваше предложение.