2010-10-05 1 views
16

У меня есть два persistence.xml файлы, ради тестирования:Как указать Maven игнорировать мой main/resources/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. 
+0

Возможный дубликат [Как настроить JPA для тестирования в Maven] (http://stackoverflow.com/questions/385532/how-to-configure-jpa-for-testing-in-maven) –

+0

Хмм , не могли бы вы добавить более подробную информацию о части OpenEJB (возможно, ссылку?). Потому что это работает с «базовыми» тестами JUnit. –

+0

Вы используете [Application discovery через classpath] (http://openejb.apache.org/3.0/application-discovery-via-the-classpath.html)? –

ответ

11

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

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

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

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

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

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

  • target/classes
  • target/test-classes

EDIT Более подробную информацию о возможностях первостепенных

Вы можете переопределить любое свойство в вашем тестовую настройку с помощью свойств системы или исходных свойств контекста (включая файлы 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 
+4

Да, я использую Maven, и важно строго отделить производство' persistence.xml' и тестирование 'persistence.xml'. Вот почему я категорически не согласен с идеей размещения 'test.persistence.xml' в' src/main/resources'. – yegor256

+0

С точки зрения ваших других сообщений, похоже, что вы можете легко уйти с опцией переопределения, связанной выше. Это более идеальный вариант, так как сохранение двух файлов persistence.xml - это боль. –

+0

Точно, я уже разобрал все это, спасибо за помощь – yegor256

1

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

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

После этого в папке Src, создать две папки с именем DEV/реконструирует и тестирует/ресурсы и копирует ваши различные ресурсы там. После этого добавьте что-то вроде этого:

<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} зависит от параметра командной строки, это может быть тест или dev. Вы запускаете команду maven следующим образом: mvn clean package -P test.

+2

Похож на очень« грязное »решение, так как я всегда должен помнить, что тесты должны запускаться с' mvn test -P test', а не как обычный 'mvn test' ... – yegor256

-2

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

+0

@iiekm Если есть два разных наименования устройства - как я могу запускать свои модульные тесты с автоматическим вводом 'EntityManager'' unitName'? – yegor256

+0

Я никогда не использовал @PersistenceContext, поэтому я не буду рассказывать вам об этом весной - просто создайте два файла Spring XML; пусть он используется для обычного приложения (обычно вы выбираете его в web.xml), другое для теста (вы выбираете его внутри тестового кода); пусть один для производства создает EntityManager с постоянным контекстом abc-production, другой с abc-тестами – iirekm

0

Я тестировал эти и другие подобные решения без привлечения pom.xml ... На мой взгляд, лучший способ решить эту проблему - иметь два application-context.xml (один только для использования в тесте классы) и добавить в компонент test-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

Здесь нет Spring Framework. – fnt

Смежные вопросы