2012-04-12 82 views
2

我正在使用Spring和JUnit爲我的DAO編寫一些集成測試。我在測試方法開始時設置了我的測試數據,然後在相同的測試方法中測試我的DAO方法。問題是,如果我不刷新/提交事務,EntityManager將返回我在數據設置中創建的實體的相同實例 - 這會使我的測試無用,因爲它們將始終通過。單元測試期間提交/沖洗事務?

E.g.

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

一種方法是暴露我的DAO中的commit()和/或flush()方法。但我寧願不這樣做,因爲在生產代碼中,這幾乎不需要發生(讓EntityManager做它的事情)。有沒有一種方法可以通過註釋或Spring配置來配置?我使用Spring,JPA2和Hibernate。

回答

2

您可以在@Transactional上設置defaultRollback屬性來重置測試之間的事情。這聽起來不像你要求的,只是先把它扔出去。

在測試中,實體管理器的行爲是正確的。您希望注入不同的行爲進行測試,從而將設置從測試的其餘部分「斷開」。我在一些測試中做的一件事就是直接從測試中調用實體管理器的flush。我只需要做幾次,但是在那些情況下它很有價值。我在測試中(而不是DAO)做了這個,以便不提供DAO的方法,我不想讓人們打電話。

+0

當然,謝謝你提醒我。我很習慣通過DAO使用實體管理器,我忘記了我可以簡單地將它連接到我的測試中直接調用它。 :) – citress 2012-04-16 16:33:29