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.
Könnten Sie relevante Snippets Ihres Komponententests posten? Wahrscheinlich wird die Persistenzdatei der Hauptquelle im Test verwendet. – Raghuram
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. –
Gelöst. Weil beide im Klassenpfad der Laufzeit waren. –