2012-04-02 4 views
1

Inmitten des Lernens erstellte Maven ein einfaches JPA-Projekt (Java Persistence 1.0.2 mit EclipseLink-Implementierung 2.0.2). Dies ist eine anwendungsverwaltete Umgebung. Ich kontrolliere also den Lebenszyklus von EntityManager manuell.Unit Testcode mit falscher Persistenzeinheit

Die vom Hauptquellcode verwendete Datei persistence.xml unterscheidet sich von der Datei, die der Komponententestcode verwendet (auch empfohlen here). Der Hauptcode verwendet eine Oracle DB und der Testcode verwendet einen In-Memory Derby. Laufende Einheitstests haben die Oracle DB (!) Aktualisiert und ich habe es schließlich geschafft, das zu beheben, indem ich zwei verschiedene Persistenzeinheiten in den XML-Dateien verwendete.

Allerdings verstehe ich nicht, warum das das Problem behoben. Ich manuell erstellen und heruntergefahren die Entity Manager und sie nicht gleichzeitig ausgeführt werden. Ich bin mir ziemlich sicher, dass Maven (oder die Art, wie ich es eingerichtet habe) die Ressourcen (XML-Dateien) nicht durcheinander bringt. In der Tat, wenn ich Maven's Debug-Ausgabe ansehe, kann ich sehen, dass es die richtige XML-Datei für Komponententests verwendet. In der Tat sehe ich nicht, warum das anfänglich ein Problem sein sollte.

Könnte mich jemand bitte aufklären?

- Aktualisiert

Hier ist die src/main/resources/META-INF/persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="MainPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>org.domain.Book</class> 
     <class>org.domain.Tag</class> 
     <properties> 
      <property name="eclipselink.target-database" value="Oracle" /> 
      <property name="eclipselink.logging.level" value="INFO" /> 
      <property name="javax.persistence.jdbc.driver"  value="oracle.jdbc.OracleDriver" /> 
     <property name="javax.persistence.jdbc.url"  value="jdbc:oracle:thin:@xxx:1526:XE" /> 
      <property name="javax.persistence.jdbc.user" value="usr" /> 
      <property name="javax.persistence.jdbc.password" value="pass" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

und hier ist src/test/resources/META-INF/Persistenz. xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence  http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
    version="2.0"> 
    <persistence-unit name="TestPU" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
     <class>org.domain.Book</class> 
     <class>org.domain.Tag</class> 
     <properties> 
      <property name="eclipselink.target-database" value="DERBY" /> 
      <property name="eclipselink.ddl-generation" value="drop-and-create- tables" /> 
      <property name="eclipselink.logging.level" value="FINE" /> 
      <property name="javax.persistence.jdbc.driver"  value="org.apache.derby.jdbc.EmbeddedDriver" /> 
      <property name="javax.persistence.jdbc.url"  value="jdbc:derby:memory:testDB;create=true" /> 
      <property name="javax.persistence.jdbc.user" value="usr" /> 
      <property name="javax.persistence.jdbc.password" value="pass" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Der Haupt Quellcode:

.... 
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MainPU"); 
EntityManager em = emf.createEntityManager(); 
EntityTransaction tx = em.getTransaction(); 

tx.begin(); 
Iterator<Book> booksItr = books.iterator(); 
while (booksItr.hasNext()) 
    em.persist(booksItr.next()); 
tx.commit(); 

em.close(); 
emf.close(); 
... 

und Unit-Test-Quellcode ist fast das gleiche, außer dass es "TestPU" verwendet, um EntityManagerFactory zu erstellen.

+0

Könnten Sie relevante Snippets Ihres Komponententests posten? Wahrscheinlich wird die Persistenzdatei der Hauptquelle im Test verwendet. – Raghuram

+0

aktualisiert die Hauptpost. Das funktioniert einwandfrei, es sei denn, im Unit-Test-Quellcode verwende ich "MainPU" anstelle von "TestPU" wie oben erwähnt. Was ich nicht verstehe ist, warum mit zwei verschiedenen Ressourcendateien (eine für Einheitentest und eine für Hauptcode verwendet), wenn sowohl Test als auch Quelle die gleiche Persistenzeinheit verwenden, Unit Test die Oracle DB aktualisiert. –

+0

Gelöst. Weil beide im Klassenpfad der Laufzeit waren. –

Antwort

-1

Wenn Sie 2 verschiedene Datenbanken haben, benötigen Sie 2 verschiedene persistence.xml Dateien. Wenn Sie in einer Datei test persistence.xml eine Testklasse haben, benötigen Sie nur eine Persistenzeinheit. Wenn Sie eine zweite Testklasse schreiben, die Geschäftsregeln testet, die auf Ihre In-Memory-Derby-Datenbank zugreifen, benötigen Sie in Ihrem Test persistence-unit eine weitere persistence.xml. Ich denke, der Grund, warum Ihr Testcode auf die Oracle DB zugreift, ist, dass Sie die Persistenzeinheit der Oracle DB in Ihrer Datei test/persistence.xml definiert haben. Sie sollten es entfernen, und Sie sollten nur diese Persistenzeinheit für die Derby In-Memory-DB haben.

+0

Dies wiederholt im Grunde die Frage und behebt das Problem nicht. Die Lösung wurde bereits gefunden (siehe Kommentare). –

+0

Mal sehen.Sie schlagen vor, dass zwei verschiedene PUs verwendet werden sollten, einer für die Quelle und ein anderer für die Tests. Recht? Wenn ja, ist das schon in der Frage. Sie liefern nichts Neues. Wenn das nicht das ist, was Sie vorschlagen, dann klären Sie bitte. –

+0

Danke Amir. Ich denke, ich habe die Frage nicht richtig verstanden. Ich hoffe, dass meine bearbeitete Antwort dich zuversichtlich macht ;-) Jede Frage willkommen – ugurkocak1980