我想围绕一些审计实体建立一些测试。我的问题是envers只对事务提交进行审计。与休眠Envers集成测试
我需要创建/编辑一些测试对象,提交事务,然后检查修订。
与envers集成测试的最佳方法是什么?
更新:这是一个非常糟糕的,非确定性的测试类,我想实现的目标。我宁愿这样做,而不依赖于测试方法的顺序
首先在单个事务中创建一个帐户和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);
}
检查[this](http://nurkiewicz.blogspot.com/2011/11/spring-pitfalls-transactional-tests.html)出 - 无耻的自我推销。 –
感谢您的回复Tomasz,我仍然不确定如何从您的博客文章解决我的问题。我对延迟加载等的误报没有任何问题,实际上提交了一些事务来设置一些审计测试数据。也许我错过了你的帖子中显而易见的东西? –
那么,滚动我的文章到'DbResetRule' - 我的想法是避免使用'@ Transactional' JUnit测试,只是让你的代码提交和回滚事务。显然这使测试不可重复和脆弱。但不是回滚所做的更改,而是建议在每次测试之前/之后倾倒数据库并将其恢复。代码是在斯卡拉,但这只是一个普遍的想法。让我知道如果这是你正在寻找的,所以我将在单独的答案中详细阐述一点。 –