我使用@Transactional我的JUnit測試(主要優勢是一個測試中改變的回滾),但我有個小問題,這影響我的服務交易。因此,例如這是春季測試inpact上服務交易
我的服務:
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class ServiceImpl
我的單元測試:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/test-context.xml" })
@Transactional
public class TestService
@Test
public void testNumberTransaction() {
Entity a = new Entity();
Entity b = new Entity();
service.add(a);
service.add(b);
}
所以我天真地期望有service.add()兩個獨立的交易記錄,但除非我用@它在一個事務內部運行的測試方法上是非事務性的(但在測試之後它不會回滾)。
這是預期嗎?我可以通過一些配置改變它嗎?
謝謝
從測試方法中刪除@Transactional不會回退事務:測試不會有任何事務。事務將在服務方法被調用時開始,並在服務方法返回時提交。 –
真實,笨拙的表述。刪除@Transactional註釋將會阻止事務管理器在java層創建一個事務。但是,大多數數據庫將始終爲每個會話創建一個隱式事務,並且如果將自動提交設置爲關閉(默認爲IIRC),則沒有事務的行爲與始終回滾的事務的行爲相同。如果我錯了,請糾正我。 – pap
錯誤,沒有。從* test *方法中移除Transactional將使測試在任何事務上下文之外運行,但Spring將仍然爲每個服務方法調用啓動事務,因爲* service *方法使用Transactional註釋。由服務完成的實際事務工作(可能更新某個數據庫)將在事務中完成並提交,除非服務本身拋出運行時異常。 –