2012-10-06 78 views
3

我想明白,如果我用@Transactional註釋我的junit類,Spring將只創建一個事務,它將在我的@Test方法之間共享並在最後回滾。反之,如果我用@Transactional標記每個@Test,就會創建一個新的事務並在@Test基礎上回滾。我在官方文檔中找不到預期的行爲(link)。Spring和JUnit,用@Transaction註釋類和方法的區別?

回答

4

@Transactional放在類級別上相當於將它放在每個測試方法上。

我不認爲有一個簡單的方法來實現你的第一個場景,即所有測試的單個事務。我不確定它會有多大意義,因爲測試將以隨機順序執行,所以您不能依靠看到其他人進行修改。當然,您可以始終使用單個事務從單個超級測試中顯式調用您的方法。

2

@Transactional在JUnit測試用例類級別將在每個測試方法之前開始新的事務並在之後回滾。

你不能在測試類的開始階段輕鬆地開始新的事務,併爲整個類保持打開狀態,至少Spring不支持它。您的第一個解決方法是使用@BeforeClass/@AfterClass對,但它們必須是static,因此您無權訪問事務管理器。

但首先問自己一個問題,你爲什麼要這樣做?聽起來像一個測試取決於另一個測試的輸出或數據庫副作用。這是一個很大的反測試模式,更不用說JUnit不能保證測試方法的執行順序。也許你只是在每個測試用例之前需要一個數據庫設置?在Spring事務的上下文中執行@Before@After,所以你可以在那裏使用它們。

相關問題