我有一个为域对象插入的测试用例。现在在域对象中,如果未设置字段“deploymentType”之一,则 postgres 有一个默认值,它将作为生产填充它。
我想在我的 spring 单元测试中对此进行测试,默认设置是在我执行插入时将 deploymentType 设置为 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”为空并且测试失败。
所以在这种情况下,当我想在单元测试中测试数据库行为时,我想我需要在测试中间访问 transactionManager,提交事务。启动一个新事务并从 db 获取域对象,然后在插入时检查 db 是否设置了默认值。
喜欢 :
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));
如何在事务性单元测试中访问事务管理器。这是正确的方法吗?