在我的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)
註釋。
我的臨時解決方案是創建一個擴展標準實現(類)的模擬類。在模擬類中,我重寫了有問題的方法,以便在調用TransactionAttributeType.REQUIRES_NEW方法註釋時不會創建新的事務。最後,在arquillian測試中,類的模擬版本被注入。在我的情況下,REQUIRES_NEW被用來減少事務超時異常的可能性,所以這個技巧會不斷測試代碼而不會產生副作用。 – anna
第一個事務已經提交了嗎?聽起來就像你試圖從不同的事務讀取數據,這是你的數據庫不允許的。 – LightGuard
嗨@anna,你有沒有找到一個適當的解決方案呢?我們現在面臨同樣的問題,我很驚訝,這不是與其他人更常見的事情! – KDK