2012-04-12 5 views
2

Ich verwende Spring und JUnit, um einige Integrationstests für mein DAO zu schreiben. Ich stelle meine Testdaten am Anfang der Testmethode auf und teste meine DAO-Methoden später in derselben Testmethode. Das Problem ist, dass der EntityManager die gleiche Instanz der Entitäten zurückgibt, die ich gerade in meinem Datensetup erstellt habe, wenn ich die Transaktion nicht lege/festschreibe. Dadurch wird mein Test unbrauchbar, da er immer übergeben wird.Commit/Flush-Transaktionen während des Komponententests?

z.

@Test 
@Transactional() 
public void loadTreeBasicCase() { 
    // creates and saved node to DB 
    Node n = createNode(); 

    // test DAO 
    Node result = dao.lookup(n.getId()); 

    // verify 
    assertThat(n, equalTo(result)); 
} 

Eine Möglichkeit besteht darin, Methoden commit() und/oder flush() in meinem DAO verfügbar zu machen. Aber das würde ich lieber nicht machen, weil dies im Produktionscode fast nie passieren muss (lassen Sie EntityManager das machen). Gibt es eine Möglichkeit, dies über Annotationen oder in Spring Config zu konfigurieren? Ich benutze Spring, JPA2 mit Hibernate.

Antwort

2

Sie können das Attribut defaultRollback auf @Transactional setzen, um Dinge zwischen den Tests zurückzusetzen. Das klingt nicht nach dem, wonach du verlangst, sondern wirf es zuerst raus.

Innerhalb des Tests verhält sich der Entitätsmanager korrekt. Sie möchten ein anderes Verhalten für das Testen injizieren, um das Setup vom Rest des Tests zu trennen. Eine Sache, die ich in einigen Tests tat, war, den Entity Manager direkt aus dem Test zu entfernen. Ich musste es nur ein paar Mal machen, aber es war in diesen Fällen wertvoll. Ich habe es im Test gemacht (nicht im DAO), um keine Methode für die DAO bereitzustellen, die ich nicht möchte, dass Leute anrufen.

+0

Natürlich, danke für die Erinnerung an mich. Ich bin so daran gewöhnt, den Entity Manager über die DAOs zu benutzen, den ich vergessen habe. Ich kann ihn einfach in meinen Test einbinden, um ihn direkt anzurufen. :) – citress