如何为使用envers的代码创建Junit?

时间:2012-07-30 19:12:46

标签: java jpa junit ehcache hibernate-envers

我要编写一个JUnit来检查是否正在维护该版本(在事件上)。这是我使用JUnit做的:

@Test
Public void testAudit() {
    try {
        //create Dao code
        dao.save();  //This will create entry in  AUD- and REVINFO-tables perfectly
        SomeObject obj = SomeHelper.getAuditData(dao));
        /*Method to be tested which generates audit message using envers i.e(dao created)*/
        //Some logic to check if output is as expected  
    }
    catch(Exception e) {
        Assert.fail();
    }
    finally {
        dao.delete();  //delete the data saved by JUnit (Problem starts here )
    }
}

调用dao的删除会导致

  

UnsupportedOperationException:无法写入只读对象

我使用Ehcache进行缓存。我搜索了这个问题并且知道可能是因为CacheConcurrencyStrategy错误地为我要删除的域对象设置了。我查了一下。

对于域对象,没有CacheConcurrencyStrategy。但是嵌套对象的CacheConcurrencyStrategy设置为READ_WRITE(这可能是真正的罪魁祸首)。

但我不想更改现有域和现有代码。是否可以绕过JUnit的CacheConcurrencyStrategy?如果没有,是否有可能在不改变现有代码的情况下出路?

1 个答案:

答案 0 :(得分:0)

ENVERs数据是在事务提交后写的,因此您的代码永远不会访问审计记录,因为还没有。如果要测试ENVER,则需要自己管理事务。这是一个例子;

@Before
public void setup() {
    // Envers audit information is written via post-event listeners and therefore the transaction needs to be
    // committed.
    PlatformTransactionManager txMgr = applicationContext.getBean(PlatformTransactionManager.class);
    TransactionStatus status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));
    Account account = accountDAO.getByUsername(UPDATE);
    if (account != null) {
        accountDAO.delete(account);
    }

    account = createAccount();
    account.setUsername(INITIAL);
    accountDAO.update(account);
    txMgr.commit(status);

    status = txMgr.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW));
    account.setUsername(UPDATE);
    accountDAO.update(account);
    txMgr.commit(status);

}

然后在测试中,您可以随意查询审计信息(原始SQL,通过AuditReader等)。