2014-04-11 68 views
0

我見過@Transactional最好放在服務層,但問題是我無法正確測試我的存儲庫,因爲沒有提交更改。@交易和信息庫測試

當測試庫save()方法,我想用find(),看看實體正確保存,但因爲save()更改不會將提交給數據庫,find()返回null。

唯一的解決方案,我看到的是添加@Transactional註解:在testSave()方法

  • 在倉庫save()方法
  • =>但IMO這是錯誤的,因爲它改變了行爲

也許我誤解了一些東西,兩天前我開始學習Java。

+0

「因爲更改沒有提交」不明白 – spiderman

+0

更改沒有提交到數據庫 – user3168219

+1

我還是沒有得到你。爲了測試功能,你可以編寫一個Junit測試用例[@RunWith(SpringJUnit4ClassRunner.class)],並在@Transactional標記[默認回滾爲true]。 – spiderman

回答

0

您不需要提交給數據庫的更改,只需要在同一事務中發出的查詢。接下來,您不應該使用存儲數據來檢索數據的相同方法。基本上你應該使用普通的jdbc來測試它是否被添加。

public class TestClass extends AbstractTransactionalSpringJUnit4ContextTests { 

    private TestRepository repo; 

@Test 
public void testSave() { 
    int rowCount = countRowsInTable("your-table-name"); 
    repo.save(yourEntity); 
    repo.flush(); 
    int rowCountAfter = countRowsInTable("your-table-name"); 
    assertTrue(rowCountAfter - rowCount == 1); // Or whatever you like to verify the row was added 
} 

注:如果不延長JpaRepository沒有flush方法,而不是,你可以注入EntityManager在測試用例和那裏調用flush

除了只測試行數,您還可以使用AbstractTransactionalJunit4SpringContextTests中的jdbcTemplate來檢索新添加的行,並與您預期的行進行比較。

+0

謝謝。事實上,我使用'JpaRepository'' save()'而不是'saveAndFlush()',因此我需要在測試中手動調用'flush'。 – user3168219

-3

這就是爲什麼您要在編寫生產代碼時編寫單元測試開始測試的原因。但是就在你兩天前開始學習Java的時候,你真的不應該馬上進入事務管理。首先了解基礎知識和設計。

+1

這是如何回答這個問題? – eis