在Spring事务测试用例中管理事务。

时间:2013-10-06 19:59:18

标签: spring unit-testing spring-test

我有一个测试用例,它为域对象执行插入操作。现在在域对象中的一个字段“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));

如何在交易单元测试中访问事务管理器。这是正确的方法吗?

1 个答案:

答案 0 :(得分:0)

您只需要访问EntityManager / SessionFactory(取决于您使用的内容)并简单地进行类刷新。

然后使用另一种查询数据库的方法(JdbcTemplate)从数据库中检索行并检查一切是否正确。您不希望通过相同的方式进行测试,因为您只是以这种方式测试第一个(或第二级)缓存。