2013-07-23 107 views
3

我正在爲我的服務編寫單元測試e。 G。 :JPA 2.0爲單元測試禁用會話緩存

@Test 
@Rollback(value = true) 
public void testMethod() 
{ 
    // insert test data 

    myService.Method(); // read/write from DB 

    // asserts go here 
} 

在應用程序運行時,每次輸入方法A時都會創建一個新的事務。但在單元測試執行過程中 - 測試testMethod進入時。所以方法A不會創建新的。 爲了正確測試,我需要在每次調用服務之前清除緩存。我不想在每個單元測試中的任何服務調用之前編寫Session.clear()。這裏最好的最佳實踐是什麼?

+0

糟糕,沒有注意到實際的標題。我做了一些粗略的搜索,無狀態的會話可能是你想使用的。 http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/batch.html#batch-statelesssession –

回答

4

EntityManager中有一個方法clear(),將放棄所有的持久化上下文:

清除持久化上下文,造成所有被管理的實體,成爲超脫。對未被刷新到數據庫的實體所做的更改不會被保留。

如果您在該方法後立即調用查詢,它將直接來自數據庫。不是來自緩存。

如果你想每次測試之前運行這一點,考慮通過繼承ExternalResource,並在每個before()after()運行方法,使用JUnit的@Rule。您可以在數據庫測試中重複使用它。