Как поручить Maven игнорировать мой main / resources / persistence.xml в пользу test / ...? - PullRequest
16 голосов
/ 05 октября 2010

У меня есть два persistence.xml файла, для тестирования:

  • src/main/resources/META-INF/persistence.xml
  • src/test/resources/META-INF/persistence.xml

Как инструктироватьMaven игнорировать первый файл во время тестирования?Теперь это не игнорируется, поскольку OpenEJB говорит:

ERROR - FAIL ... Finder: @PersistenceContext unitName has multiple matches: 
unitName "abc" has 2 possible matches.

Ответы [ 4 ]

11 голосов
/ 11 октября 2010

Проверьте функциональность альтернативных дескрипторов , которая предназначена для того, что вы пытаетесь сделать.

Попробуйте эту настройку:

  • src/main/resources/META-INF/persistence.xml
  • src/main/resources/META-INF/test.persistence.xml

Затем вы можете создать OpenEJB для предпочтения файла test.persistence.xml, установив для свойства openejb.altdd.prefix System или InitialContext значение test

Aдругое возможное решение может заключаться в переопределении свойств единицы сохраняемости в тесте .При таком подходе вы можете избежать потребности во второй persistence.xml, что может быть приятно, так как поддержание двух может быть проблемой.

Вы можете использовать подход Maven, но помните, что в соответствии со спецификацией поставщик персистентности будет толькоищите (или сканируйте) для @Entity bean-компонентов в точном jar или каталоге, где находится persistence.xml.Так что имейте в виду, что в Maven это два разных места:

  • target/classes
  • target/test-classes

РЕДАКТИРОВАТЬ Подробнее о переопределяющих возможностях

Вы можете переопределить любое свойство в настройках теста с помощью либо системных свойств, либо свойств начального контекста (включая файлы jndi.properties).Формат:

<unit-name>.<property>=<value>

Так, например, со следующим persistence.xml:

<persistence>
  <persistence-unit name="movie-unit">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <jta-data-source>movieDatabase</jta-data-source>
    <non-jta-data-source>movieDatabaseUnmanaged</non-jta-data-source>
    <properties>
      <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
      <property name="hibernate.max_fetch_depth" value="3"/>
    </properties>
  </persistence-unit>
</persistence>

Вы можете переопределить и добавить постоянствосвойства объекта в вашем тестовом случае.В настоящее время нет средств для их удаления (если у вас есть необходимость, дайте нам знать - это пока не получится).

Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY,"org.apache.openejb.client.LocalInitialContextFactory");

p.put("movie-unit.hibernate.hbm2ddl.auto", "update");
p.put("movie-unit.hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

context = new InitialContext(p);

Или через файл jndi.properties

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory
movie-unit.hibernate.hbm2ddl.auto = update
movie-unit.hibernate.dialect = org.hibernate.dialect.HSQLDialect
1 голос
/ 05 октября 2010

Я думаю, вы можете создать два профиля в вашем pom.xml:

<properties>
  <environment>dev</environment>
</properties>
<profiles>
  <profile>
    <id>prod</id>
    <properties>
      <environment>test</environment>
    </properties>
  </profile>
</profiles>

После этого в вашей папке src создайте две папки с именем dev / resoruces и test / resources и скопируйте туда свои разные ресурсы,После этого добавьте что-то вроде этого:

<resources>
  <resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>false</filtering>
  </resource>
  <resource>
    <directory>${basedir}/src/main/${environment}/resources</directory>
    <filtering>true</filtering>
  </resource>
</resources>

$ {basedir} зависит от параметра командной строки, это может быть test или dev.Вы запускаете команду maven следующим образом: mvn clean package -P test .

0 голосов
/ 16 апреля 2014

Я тестировал эти и другие подобные решения без участия pom.xml ... На мой взгляд, лучший способ решить эту проблему - это иметь два application-context.xml (одно только для использования в тестовых классах). ) и добавить пользовательский компонент диспетчера единиц хранения в файл application-context.xml теста. Как этот пример:

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
  <property name="persistenceXmlLocation">
     <value>classpath*:META-INF/test.persistence.xml</value>
  </property>
  <property name="defaultDataSource" ref="dataSource"/>
</bean>

Это решение работает. :)

0 голосов
/ 12 октября 2010

Лучше добавить оба файла - в общем, различие между сборкой test / production или debug / profile / production в сборке создает только проблемы.Лучше попытаться использовать разные имена единиц perasistence для производства (например, abc-production) и для тестов (abc-tests).

...