2013-10-06 78 views
1

我有一個測試用例,它爲域對象執行插入操作。現在在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)); 

我如何獲得訪問事務管理器在單元測試是事務性的。這是正確的方式嗎?

+0

由於您在測試期間正在提交db,因此這更多的是集成測試,而不是單元測試。 – Spock

回答

0

你只需要訪問EntityManager/SessionFactory(取決於你使用什麼)和簡單的類刷新。

然後使用另一種查詢數據庫(JdbcTemplate)的方法從數據庫中檢索行並檢查一切是否正確。你不想用同樣的方法測試你在數據庫中放置什麼東西,因爲你只是以這種方式測試第一個(或第二個)緩存。