1

我有一个为域对象插入的测试用例。现在在域对象中,如果未设置字段“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));

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

4

1 回答 1

0

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

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

于 2013-10-07T06:28:52.117 回答