我有一个测试用例,它为域对象执行插入操作。现在在域对象中的一个字段“deploymentType”如果没有设置,那么postgres有一个默认值,它将作为生产填充它。
我想在我的弹簧单元测试中对此进行测试,当我将一个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并且测试失败。
所以在这种情况下,当我想在单元测试中测试db行为时,我想我需要在测试中间访问transactionManager,提交事务。启动一个新的Transaction并从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));
如何在交易单元测试中访问事务管理器。这是正确的方法吗?
答案 0 :(得分:0)
您只需要访问EntityManager / SessionFactory(取决于您使用的内容)并简单地进行类刷新。
然后使用另一种查询数据库的方法(JdbcTemplate)从数据库中检索行并检查一切是否正确。您不希望通过相同的方式进行测试,因为您只是以这种方式测试第一个(或第二级)缓存。