1

我要编写一个 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 调用 delete 会导致

UnsupportedOperationException:无法写入只读对象

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

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

但我不想更改现有域和现有代码。有没有办法绕过CacheConcurrencyStrategyJUnit?如果没有,是否有任何可能的出路而不更改现有代码?

4

1 回答 1

2

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 等)。

于 2016-03-26T19:53:46.573 回答