2015-09-02 51 views
2

在我的arquillian測試中,調用了大量的應用程序方法,它們從數據庫讀取數據或創建數據並保存到數據庫。 a)在某個點上調用了一個用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)註解的方法。測試失敗,因爲註釋方法無法找到(在讀取時返回0條記錄)某些數據由一些先前調用的方法持久化(用TransactionAttributeType.REQUIRED註釋)。可能這是新交易開啓後的正常行爲。讀取先前調用的方法中的數據並將它們作爲參數傳遞給註釋的(TransactionAttributeType.REQUIRE)方法可以正常工作,但數據應在REQUIRES_NEW方法內讀取。在使用TransactionAttributeType.REQUIRES_NEW時,其他測試中會出現同樣的問題。有處理這種情況的解決方法嗎?Arquillian和TransactionAttributeType.REQUIRES_NEW

b)我也提到過,arquillian有@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)註解的方法有問題。這就像這些方法中的代碼根本不被執行。

我對這兩個問題的當前解決方案是創建一個Mock類覆蓋有問題的方法。在b的情況下,重寫的方法用@TransactionAttribute(TransactionAttributeType.SUPPORTS)註釋。

+0

我的臨時解決方案是創建一個擴展標準實現(類)的模擬類。在模擬類中,我重寫了有問題的方法,以便在調用TransactionAttributeType.REQUIRES_NEW方法註釋時不會創建新的事務。最後,在arquillian測試中,類的模擬版本被注入。在我的情況下,REQUIRES_NEW被用來減少事務超時異常的可能性,所以這個技巧會不斷測試代碼而不會產生副作用。 – anna

+0

第一個事務已經提交了嗎?聽起來就像你試圖從不同的事務讀取數據,這是你的數據庫不允許的。 – LightGuard

+0

嗨@anna,你有沒有找到一個適當的解決方案呢?我們現在面臨同樣的問題,我很驚訝,這不是與其他人更常見的事情! – KDK

回答

0

在調用使用TransactionAttributeType.REQUIRED_NEW註釋的方法之前,嘗試使用flush()方法,然後嘗試EntityManager的refresh()。

+0

謝謝@Chirag soni。我已經嘗試了這兩個。我也試過EntityManager.clear()。仍然是同樣的問題。 – anna