我要编写一个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
?如果没有,是否有可能在不改变现有代码的情况下出路?
答案 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等)。