2017-07-07 98 views
0

我使用springboot 1.5.2.RELEASE和我的服務是annoted與如何回滾單元測試,而服務層是@Transactional

@Service 
@Transactional(rollbackFor = Exception.class) 

我的單元測試類與註釋:

@RunWith(SpringRunner.class) 
@SpringBootTest 

需要量:試驗結束後回滾單元測試方法在數據庫中的改變。

提出的解決方案之一:就是在測試類中添加@Transactional註解,我嘗試過,但這種解決方案會產生一些問題,就是有時候測試事務回滾之前(即使沒有任何異常拋出!)服務交易完成!

任何人都可以提供另一個好的解決方案來回滾測試嗎?

回答

1

測試類上的@Transactional解決方案是執行此操作的標準方法。 Spring Tx沒有辦法將事務回滾到藍色之外,所以我建議您仔細研究遇到的問題,而不是發明其他解決方案。

+0

中使用@Rollback(false),那麼這可能是迄今爲止最好的建議,我會在我的測試方法中深入探討可能導致此行爲的原因。 –

1

如果不更改默認行爲,所有更改都將被回滾。而你沒有與事務傳播級別= REQUIRES_NEW類/方法,因爲它開始獨立交易,並且可以提交或與外部事務回滾獨立

事務回滾和提交行爲

默認情況下,測試交易將在 完成測試後自動回滾;然而,事務提交和回滾 行爲可以通過@Commit和@Rollback 註釋以聲明方式配置。

@Rollback

@Rollback指示是否與測試方法完成後的一個事務性測試方法 事務應該回滾。如果 爲真,則事務回滾;否則,交易是 承諾(另請參閱@Commit)。即使未明確聲明@Rollback ,Spring TestContext框架中的集成測試 的回滾語義默認爲true。

當作爲類級註釋聲明時,@Rollback爲測試類 層次結構中的所有測試方法定義 默認回滾語義。當聲明爲方法級批註時,@Rollback 爲特定測試方法定義回滾語義,可能爲 覆蓋類級別的@Rollback或@Commit語義。

+0

奇怪的是,我沒有使用傳播新的和默認行爲是沒有回滾,你有什麼建議? –

+0

1)我寫了 - '你沒有'。 2)即使在測試完成後回調中的回滾成功事務。這是測試的默認行爲。如果你需要保存更改,並且不要在測試類或方法 – xyz

1

docs

默認情況下,測試數據將被自動 完成測試後回滾;然而,事務提交和回滾行爲可以通過@Commit和@Rollback註釋聲明性地配置。

您的評論:

有時測試交易服務交易之前回滾(!即使沒有任何 拋出異常)完成!

對我沒有意義。你怎麼知道txn是否已完成或者是否已經回滾?例外情況對測試無關緊要,因爲我引用了上述文檔。

+0

在控制檯中,我看到日誌:回滾事務,並且在我的單元測試方法內調用某些方法之前,有時會記錄此事(有時並不總是)。 –

+0

@MahmoudS測試完成後測試數據是否留在數據庫中? –

+0

當我在測試類中使用transacional時,測試數據不會遺留,但正如我所說有時測試會無緣無故地回滾並跳過調用某些方法! –