【发布时间】:2012-01-11 22:11:04
【问题描述】:
我正在尝试围绕一些经过审计的实体构建一些测试。我的问题是 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 out - 无耻的自我推销。
-
感谢 Tomasz 的回复,不过我仍然不确定如何从您的博客文章中解决我的问题。我对延迟加载等误报并没有真正的问题,更多的是实际提交一些事务来设置一些审计测试数据。也许我错过了你帖子中明显的一些东西?
-
好吧,将我的文章向下滚动到
DbResetRule- 我的想法是避免使用@TransactionalJUnit 测试,而让您的代码提交和回滚事务。显然,这使得测试不可重复且脆弱。但是,我建议在每次测试之前/之后转储数据库并恢复它,而不是回滚更改。代码在 Scala 中,但这只是一个一般性的想法。让我知道这是否是您正在寻找的东西,所以我将在单独的答案中详细说明。 -
当您使用
@Transactional注释方法时,您无需手动执行任何操作。看起来你已经在这样做了。但是当你从测试中删除@Transactional时,你不能简单地在测试中使用EntityManager。要么将其访问封装在事务性 bean 中,要么使用TransactionTemplate。 -
太棒了,正是我需要的。已添加我的代码作为答案。
标签: hibernate jpa-2.0 integration-testing hibernate-envers