2010-07-26 126 views
1

在我的測試代碼中,我需要在每種方法上都有一個空白/空數據庫。是否有代碼可以實現這一點,在測試的@Before中調用?如何刪除所有JPA實體?

+0

你是怎麼做到的?我需要這樣做。 – 2016-04-04 07:28:07

回答

2

其實你總是可以使用JPQL,

em 
    .createQuery("DELETE FROM MyEntity m") 
    .executeUpdate() 
; 

但是要注意,沒有贈款實體緩存亦將清洗。但是對於單元測試而言,它看起來很不錯。

+0

以及如何使用標準api編寫該代碼?我看不到刪除()。它僅適用於DML嗎? – simpatico 2010-07-26 09:27:27

+0

是的,這個刪除是DML。 我通常的測試方案是添加@BeforeClass和@AfterClass(爲了您的情況將其更改爲@Before和@After)。在「清理代碼之後」清除所有添加的記錄:em.createQuery(「DELETE FROM MailMessage m where m.mailMessageId =:id」)。setParameter(「id」,message.getMailMessageId())。executeUpdate(); 因此,可能這是回答如何提供標準 – Dewfy 2010-07-26 10:27:38

+0

em.clear()之前似乎解決緩存問題。 – simpatico 2010-07-26 10:31:29

0

在我的測試代碼中,我需要在每種方法都有一個空白/空數據庫。

我會運行測試方法內幕交易(並在每個方法結束回滾)。這是通常的做法。如果您剛剛刪除它們,我沒有看到提交事務並將數據寫入數據庫的要點。只是不要提交。

另一種方法(不是排除)是在測試執行之前使用DbUnit將數據庫置於已知狀態。這樣做時,通常不需要清理它。

另一種選擇是使用原始JDBC刪除數據庫(如果存在),然後讓JPA重新創建整個數據庫。雖然會很慢。

+0

我明白了。我測試了寫入數據庫的整個「操作」,然後將數據庫狀態與預期進行比較。事務落在我測試的方法後面(我從外面測試)。 – simpatico 2010-07-27 13:15:40

+0

@simpatico:你不覺得這種細節有助於獲得很好的答案嗎? – 2010-07-27 16:59:08

+0

我會研究dbUnit,我想我也有緩存問題,因爲單獨運行每個測試的工作,但一起不(它聲稱存在來自另一個測試的殘留數據)。 建議在整個應用程序中使用單一實體管理器嗎?我見過的教程不這樣做。 – simpatico 2010-07-27 18:18:22