2013-03-18 54 views
4

我正在進行單元測試,它通過DAO向Oracle數據庫提交信息,然後檢索它並檢查一切是否未更改。@NotTransactional alternatives

有在測試類中其他的單元測試,並在類的頂部,我有:

@TransactionConfiguration (defaultRollback = true) 

我想知道我怎麼能刪除@NotTransactional。我沒有在類中指定Transactional,所以默認情況下沒有測試應該是這樣的。由於這是自己的測試,我不知道@BeforeTransaction(或After)註釋是否正確。

最大的問題是沒有@NotTransactional,它看起來好像unsubscribe()函數沒有運行。 (垃圾標誌未更改)

再次運行測試,使用@ rollback = false和@NonTransactional,我在數據庫中看到垃圾標誌正確設置爲true,測試完成後數據庫中。

@RunWith (SpringJUnit4ClassRunner.class) 
@TransactionConfiguration (defaultRollback = true) 
public class DatabaseTest { 

    @Autowired (required = true) 
    private FooDao<Foo> fooDao; 

    @Autowired (required = true) 
    private FooService fooService; 

    // other tests here that are marked @Transactional. 

    @Test 
    @NotTransactional 
    public void testDelete() { 
     Foo foo = new foo(); 
     foo.setTrashFlag(false); 
     foo.setId(123); 

     fooDao.create(foo); 

     Foo fooFromDb = fooService.getFromDbById(123); 
     assertNotNull(fooFromDb); 

     fooService.unsubscribe(123); // among other things, 
             // **sets trash flag to true.** 

    // sqlSession.flushStatements(); // doesn't seem to commit the unsubscribe action 


     // getFromDbById() returns ONLY Foos with trash set to false, so we expect 
     // nothing returned here as we've just set trash to true, using unsubscribe(). 

     Foo trashedFoo = fooService.getFromDbById(123); 
     assertNull(trashedFoo); 

謝謝!

+0

您應該可以閱讀您在同一交易中寫下的任何記錄。 – Marvo 2013-03-18 23:18:08

+0

我同意。我仍然無法確定爲什麼它不會在測試方法上沒有執行@NotTransactional。 – iank 2013-03-19 15:55:16

+0

我承認我從來沒有聽說過NotTransactional,直到你的問題。你能否展示你的一個測試並解釋你期望發生的事情?如果我需要訪問Hibernate對象上的子記錄,我只需將@Transactional放在我的測試中,這對我很有用。 – Marvo 2013-03-19 18:46:40

回答

3

@Rollback(false)並不總是足夠的,它只意味着交易不會在測試結束時回滾。但它仍然在事務中運行測試,這有時會導致與其他正在運行的事務發生衝突。

在Spring建議,你有兩個選擇:

  1. 斯普利特測試類一分爲二,交易測試可以與@Transactional註解測試類是一個,而在測試類中的非事務性測試,而不交易註釋。
  2. 使用方法註釋而不是類註釋,註釋每個事務測試與@Transactional,但是從類範圍

引用彈簧documentation移除:

在Spring 3.0,@NotTransactional在已棄用有利於將非交易測試方法移動到單獨的(非交易型) 測試類別或@BeforeTransaction@AfterTransaction方法。作爲 可以使用@Transactional, 註釋整個類的替代方案,請考慮使用@Transactional註釋單個方法;這樣做 允許在相同的測試類中混合使用事務性和非事務性方法,而無需使用@NotTransactional

7

我不知道這是否真的在主題上,但我使用了@NotTransactional來處理具有事務基類的方法。春說分裂的事務性和非事務性的測試,但我發現,在我的情況下,只需添加以下的方法只是殘疾人事務,讓我刪除過時的註釋:

@Transactional(propagation = Propagation.NEVER) 

我以爲我只是把它放在這裏是爲了那些和我一樣的事情而奔跑的人。