我有一個測試用例,它爲域對象執行插入操作。現在在domain對象的其中一個字段「deploymentType」中,如果它沒有設置,那麼postgres會有一個默認值,它會將它作爲生產填充。管理Spring事務性測試用例中的事務。
我想測試這個在我的春天單元測試的默認設置,當我做一個insertType設置爲null和postgres照顧它的插入。
我的測試案例延伸AbstractTransactionalTestNGSpringContextTests和已經被註釋與
@Transactional(propagation = Propagation.NESTED)
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
單元測試情況如下。
@Test
public void createCustomerWithSite() {
this.customerService.createCustomerSite(TestData.makeCustomerSite(this.customer, "test-alias"));
final List<CustomerSite> list = this.customerService.findCustomerSites(this.customer.getId());
assertThat(list.size(), is(1));
final CustomerSite cs = list.get(0);
assertThat(cs.getClusterDeploymentType(), is(ClusterDeploymentType.PRODUCTION));
}
現在由於測試是事務性的承諾永遠不會發生,因此,當我回來的域對象我看到「deploymentType」爲null,並且測試失敗。
所以在這種情況下,當我想在單元測試中測試數據庫行爲時,我想我需要在測試過程中訪問transactionManager,提交事務。啓動一個新的事務並從數據庫獲取域對象,然後檢查插入時是否通過數據庫設置了默認值。
像:
this.customerService.createCustomerSite(TestData.makeCustomerSite(this.customer, "test-alias"));
TransactionManager tm = getTransactionManager();
tm.commit(); // the default type will be insterted in db and be visible in next transaction.
tm.beginTransaction();
final List<CustomerSite> list = this.customerService.findCustomerSites(this.customer.getId());
assertThat(list.size(), is(1));
final CustomerSite cs = list.get(0);
assertThat(cs.getClusterDeploymentType(), is(ClusterDeploymentType.PRODUCTION));
我如何獲得訪問事務管理器在單元測試是事務性的。這是正確的方式嗎?
由於您在測試期間正在提交db,因此這更多的是集成測試,而不是單元測試。 – Spock