hibernate - 与Hibernate Envers进行集成测试

标签 hibernate jpa-2.0 integration-testing hibernate-envers

我正在尝试围绕一些已审计实体进行一些测试。我的问题是只对事务提交进行审核。

我需要创建/编辑一些测试对象,提交事务,然后检查修订。

用envers进行集成测试的最佳方法是什么?

更新:这是我想要实现的非常糟糕的,不确定性的测试类。我宁愿不依赖测试方法的顺序来执行此操作

首先在一个事务中创建一个account和account_transaction。这两个审核的条目都用于修订1。

其次,在新事务中更新了account_transaction。经审核的分录为修订版2。

第三,加载修订版本1中的已审核帐户,并对其进行处理。

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/testApplicationContext.xml"})
public class TestAuditing {

    @Autowired
    private AccountDao accountDao;

    @PersistenceContext
    private EntityManager entityManager;

    @Test
    @Rollback(false)
    public void first() {
        Account account = account("Test Account", "xxxxxxxx", "xxxxxx");

        AccountTransaction transaction = transaction(new Date(), Deposit, 100, "Deposit");
        account.setTransactions(newArrayList(transaction));

        accountDao.create(account);
    }

    @Test
    @Rollback(false)
    public void second() {
        Account account = accountDao.getById(1L);
        AccountTransaction transaction = account.getTransactions().get(0);
        transaction.setDescription("Updated Transaction");
        accountDao.update(account);
    }

    @Test
    public void third() {
        AuditReader reader = AuditReaderFactory.get(entityManager);

        List<Number> accountRevisions = reader.getRevisions(Account.class, 1L);
        //One revision [1]

        List<Number> transactionRevisions = reader.getRevisions(AccountTransaction.class, 1L);
        //Two revisions [1, 2]

        Account currentAccount = accountDao.getById(1L);
        Account revisionAccount = (Account) reader.createQuery().forEntitiesAtRevision(Account.class, 1).getSingleResult();

        System.out.println(revisionAccount);
    }

最佳答案

我是Spring的事务测试支持的用户,该事务在完成后会回滚测试,并且由于envers的设计,因此不会创建修订。我创建了一个hack,该hack似乎允许人们在事务提交之前“告诉” envers手动完成其工作,但允许spring继续回滚。

这些片段应该有所帮助。
1.创建自己的审核监听器,该审核监听器将覆盖现有的envers审核监听器。这允许访问对单元测试可见的静态成员。也许有更好的方法,但是它可以工作。

public class AuditEventListenerForUnitTesting extends AuditEventListener {

   public static AuditConfiguration auditConfig;

   @Override
   public void initialize(Configuration cfg) {
      super.initialize(cfg);
      auditConfig = super.getVerCfg();
   }
}

修改您的persistence.xml以包括此新的监听器类,而不是envers提供的类


(如有必要,请其他听众重复)

现在在“单元”测试中:
{
   saveNewList(owner); //code that does usual entity creation
   em.flush();  
   EventSource hibSession = (EventSource) em.getDelegate();
   AuditEventListenerForUnitTesting.auditConfig.getSyncManager().get(hibSession).doBeforeTransactionCompletion(hibSession);     
   //look for envers revisions now, and they should be there
}

我需要这样做是因为我有一些针对 hibernate 实体的JDBC查询,这些查询已加入到版本控制表中。

关于hibernate - 与Hibernate Envers进行集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363815/

相关文章:

java - 将 MySQL JSON 列映射到 hibernate 值类型

java - 返回从第 N 次出现开始的子串

java - Ehcache 与静态 map 缓存实现

hibernate - findAll() 方法在 Hibernate 中给出空结果集

java - 如果我禁用授权,如何在测试中模拟安全上下文

java - 删除多对一关系不会持久

java - 嵌套事务理论上可用,但未使用

HIBERNATE - JPA2 - H2 - 按键查询@ElementCollections HashMap

java - Spring Aspect 未在测试环境中运行

asp.net-mvc-routing - ASP.NET Web Api 路由(IIS 与自托管)