我見過@Transactional
最好放在服務層,但問題是我無法正確測試我的存儲庫,因爲沒有提交更改。@交易和信息庫測試
當測試庫save()
方法,我想用find()
,看看實體正確保存,但因爲save()
更改不會將提交給數據庫,find()
返回null。
唯一的解決方案,我看到的是添加@Transactional
註解:在testSave()
方法
- 在倉庫
save()
方法 - =>但IMO這是錯誤的,因爲它改變了行爲
也許我誤解了一些東西,兩天前我開始學習Java。
我見過@Transactional
最好放在服務層,但問題是我無法正確測試我的存儲庫,因爲沒有提交更改。@交易和信息庫測試
當測試庫save()
方法,我想用find()
,看看實體正確保存,但因爲save()
更改不會將提交給數據庫,find()
返回null。
唯一的解決方案,我看到的是添加@Transactional
註解:在testSave()
方法
save()
方法也許我誤解了一些東西,兩天前我開始學習Java。
您不需要提交給數據庫的更改,只需要在同一事務中發出的查詢。接下來,您不應該使用存儲數據來檢索數據的相同方法。基本上你應該使用普通的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
來檢索新添加的行,並與您預期的行進行比較。
謝謝。事實上,我使用'JpaRepository'' save()'而不是'saveAndFlush()',因此我需要在測試中手動調用'flush'。 – user3168219
「因爲更改沒有提交」不明白 – spiderman
更改沒有提交到數據庫 – user3168219
我還是沒有得到你。爲了測試功能,你可以編寫一個Junit測試用例[@RunWith(SpringJUnit4ClassRunner.class)],並在@Transactional標記[默認回滾爲true]。 – spiderman