2010-10-05 13 views
16

Mam dwa persistence.xml plików, przez wzgląd na badania:Jak poinstruować Mavena, aby zignorował mój główny/resources/persistence.xml na rzecz test/...?

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

Jak polecić Maven zignorować pierwszy plik podczas testów? Teraz to nie jest ignorowany od OpenEJB mówi:

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

możliwy duplikat [Jak skonfigurować WZP do testowania w Maven] (http://stackoverflow.com/questions/385532/how-to-configure-jpa-for-testing-in-maven) –

+0

Hmm , czy mógłbyś dodać więcej szczegółów na temat części OpenEJB (może link?). Ponieważ działa to z "podstawowymi" testami JUnit. –

+0

Czy używasz [Wykrywania aplikacji za pośrednictwem ścieżki klasy] (http://openejb.apache.org/3.0/application-discovery-via-the-classpath.html)? –

Odpowiedz

11

Zapoznaj się z funkcją alternate descriptors, która ma na celu to, co próbujesz zrobić.

Spróbuj Setup:

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

Następnie można skonstruować OpenEJB wolą plik test.persistence.xml przez ustawienie systemu openejb.altdd.prefix lub mienia InitialContext do test

A możliwe inne rozwiązanie override the persistence unit properties in the test. Dzięki takiemu podejściu można uniknąć potrzeby drugiego, co może być miłe, ponieważ utrzymanie dwóch może być uciążliwe.

Można użyć podejścia Maven, ale należy pamiętać, że według specyfikacji dostawca utrwalania będzie wyglądał (aka skan) dla ziaren @Entity w dokładnym słoiku lub katalogu, w którym znajduje się persistence.xml. Więc być uwrażliwione że w Maven są to dwie różne lokalizacje:

  • target/classes
  • target/test-classes

EDIT Więcej szczegółów na temat możliwości nadrzędnych

można przesłonić właściwości w Twoim przetestuj instalację za pomocą właściwości systemowych lub początkowych właściwości kontekstu (dotyczy to plików jndi.properties).Format jest:

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

Tak na przykład z następującym 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> 

Można przesłanianie i dodać właściwości jednostek wytrwałość w przypadku testowego. Obecnie nie ma urządzeń do ich usuwania (jeśli masz taką potrzebę, daj nam znać - do tej pory tak naprawdę nie wyszło).

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

Lub alternatywnie poprzez jndi.properties pliku

java.naming.factory.initial=org.apache.openejb.client.LocalInitialContextFactory 
movie-unit.hibernate.hbm2ddl.auto = update 
movie-unit.hibernate.dialect = org.hibernate.dialect.HSQLDialect 
+4

Tak, używam Mavena i ważne jest, aby ściśle oddzielić produkcję' persistence.xml' od testowania 'persistence.xml'. Dlatego zdecydowanie nie zgadzam się z pomysłem umieszczenia 'test.persistence.xml' w' src/main/resources'. – yegor256

+0

Wygląda na to, że z innych postów można łatwo oderwać się od powyższej opcji przesłaniania. To jest bardziej idealna opcja, ponieważ utrzymywanie dwóch plików persistence.xml jest uciążliwe. –

+0

Dokładnie już to posortowałem, dziękuję za pomoc – yegor256

1

myślę, że można utworzyć dwa profile w Twojej pom.xml:

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

Następnie w folderze src utwórz dwa foldery o nazwie dev/resoruces i testuj/zasoby i kopiuj tam swoje różne zasoby. Następnie dodaj coś takiego:

<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} zależy od parametru wiersza poleceń, może to być test lub dev. Uruchomisz polecenie maven w ten sposób: pakiet czysty mvn -P test.

+2

Wygląda jak bardzo" brudne "rozwiązanie, ponieważ zawsze muszę pamiętać, że testy mają być uruchamiane z' ' test mvn -P test ", nie jak zwykle" test mvn "... – yegor256

-2

Lepiej dodać oba pliki - w ogóle, dzięki czemu test/produkcji lub debugowania/profil/wyróżnienie produkcja w budowie sprawia tylko kłopoty. Lepiej spróbuj użyć innej nazwy jednostki perazistencji do produkcji (powiedzmy abc-production) i do testów (abc-tests).

+0

@iiekm Jeśli istnieją dwie różne nazwy jednostek - w jaki sposób mogę uruchomić moje testy jednostkowe za pomocą automatycznego wtrysku 'EntityManager' przez' unitName'? – yegor256

+0

Nigdy nie używałem @PersistenceContext, więc nie powiem Ci tego wiosną - wystarczy utworzyć dwa wiosenne pliki XML; niech jeden będzie używany do zwykłej aplikacji (zwykle wybierasz go w web.xml), inny do testu (wybierasz go wewnątrz kodu testowego); niech ten do produkcji utworzy EntityManager z abc-production kontekstem trwałości, drugi z abc-testami – iirekm

0

Testowałem te i inne podobne rozwiązania bez udziału pom.xml ... Moim zdaniem najlepszym sposobem rozwiązania tego problemu jest posiadanie dwóch aplikacji-context.xml (tylko do użycia w teście klasy) i dodać niestandardową komponent bean menedżera jednostek utrwalania w aplikacji testowej context.xml. Podobnie jak w tym przykładzie:

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

To rozwiązanie działa. :)

+0

Nie ma tutaj w tym kontekście Spring Framework. – fnt

Powiązane problemy