2012-03-26 6 views
2

Haben Sie einen JUnit-Test als solcheEinheit Test bestanden wird, wenn @Transactional markiert, aber nicht, wenn sie nicht

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration({ "/applicationContext.xml", "/applicationContext-security.xml" }) 
@TransactionConfiguration(defaultRollback = true) 
@Transactional 
public class BlahIntegrationTests{ 

@Test 
public void testMappingsOfHugeObjectGraph(){ 
} 
} 

einrichten Ich bin versucht zu testen, dass meine Hibernate Mappings (Anmerkung angetrieben und PPV basiert) korrekt sind und wenn Lauf wie über meinen Testdurchläufen (nur bestätigt, dass eine ID erstellt wurde).

Wenn ich die @Transactional weg nehmen, bekomme ich Fehler mit einigen meiner Beziehungen, die ich erwartet hatte. Wer noch Gedanken darüber, warum es nicht versagt hat, wenn es @Transactional ist?

EDIT: Um zu klären, die Ausnahme, die schlechte Hibernate Mappings wurde bezüglich geworfen wurde (es eine sehr große Objektstruktur ist, und ich habe einige von ihnen borked)

Antwort

4

Wenn Sie @Transactional Ihr Test DB wird nicht für einen anderen Test und deshalb Tests isoliert werden nicht leer entfernen.

Wenn Sie es dort haben, dann können einige Tests bestanden werden, obwohl sie fehlschlagen sollten (wie Sie beschrieben haben, oder ein anderes Beispiel ist, wenn Sie eine Entität einfügen, die eine eindeutige Einschränkung dupliziert). Folgende

Lösung ist @Transactional an seinem Platz zu haben und

@PersistenceContext 
private EntityManager em; 

und tun injizieren, bevor Sie Ihre Daten aus der Datenbank extrahieren

em.flush(); 
em.clear(); 

Die erste Zeile wird die Synchronisation zwischen Sitzung und Datenbank führen (Ihr Provider wartet normalerweise bis zum Ende der Transaktion). Die zweite Zeile werden alle Einheiten von Sitzung entfernen, so werden alle Anfragen an die Datenbank gehen.

und nach dem Test wird alles noch zurück gerollt, so dass Sie Ihre Datenbank in ursprünglichem Zustand haben.

Ich hoffe, es hilft.

+0

Es war in der Tat der Flush, der passieren musste. Das spezifische Problem war in den paar hundert Spalten auf meinen vielen Tischen, von denen ich wusste, dass ich ein paar Typen usw. hatte und ich benutzte den Komponententest, um sie zu reparieren. Jetzt, da ich einen dao.flush() habe, findet er die Fehler richtig. – dstarh

0

@Transactional die beim Speichern des Objekts wegzunehmen Wenn Sie Die Hibernate-Factory wird im Auto-Commit-Modus ausgeführt, in dem jeder neue Zugriff eine neue Sitzung generiert. Sobald Sie also ein Objekt abgerufen haben, ist es sofort nicht mehr mit einer geöffneten Sitzung verknüpft und daher nicht für Lazy Loading geeignet.

+0

Ja, aber das Problem, das ich habe, ist eine schlechte Zuordnung zu SAVE in Bezug bekommen. Ich werde zu meinem q hinzufügen. – dstarh

Verwandte Themen