Подтвердить что ты не робот

Как указать Maven игнорировать мой main/resources/persistence.xml в пользу теста/...?

У меня есть два файла 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.
4b9b3361

Ответ 1

Проверьте альтернативные дескрипторы, которые направлены на то, что вы пытаетесь сделать.

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

  • 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

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

Вы можете использовать подход Maven, но имейте в виду, что за спецификацией поставщик сохранения останется только (aka scan) для @Entity beans в точном банке или каталоге, где найден 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

Ответ 2

Я думаю, вы можете создать два профиля в вашем 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.

Ответ 3

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

<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>

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

Ответ 4

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