我们使用的是Spring Boot 2,在集成测试中,我们需要在事务中手动执行一些代码,在事务结束时以及断言之后,我们希望回滚该事务。
我们使用显式定义的事务而不是@Transactional,因为有时我们需要在测试2事务中执行。
这是测试样本:
@Test
public void fooTest() {
// transaction 1
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// some code in transaction
}
// transaction 2
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
// some code in transaction
}
// here I need rollback these transactions for clean db for another tests
}
您能告诉我在我们的案例中如何使用回滚来回滚两个事务吗?我们所维护的代码很少,因此,如果有可能在启动2中做得更好,我将不胜感激。我们只需要在一个测试中执行2个事务。
答案 0 :(得分:1)
在0
中存储对每个TransactionStatus
的引用,并在测试后使用事务管理器回滚它们。
AtomicReference
答案 1 :(得分:0)
如果您确实需要启动两个独立运行的事务,则对每个事务进行一些工作,并且您需要在它们都运行之后但在提交或回滚之前检查一些断言-然后需要提交或在断言之后都回滚,您将需要建立自己的多线程结构...类似
execute(AssertCallback aC, TransactionCallback ... tCs);
此方法将为每个tC启动一个线程。每个线程将在每个线程中以及回调函数的返回块上调用回调方法,直到执行tC的所有线程到达同一点为止。主线程还将等待所有tC线程阻塞,然后运行aC回调,并在返回时释放所有tC线程,以便它们可以提交/回滚并退出。
这似乎有点怪异,因为aC回调无法“看到”任何tC回调完成的任何工作,因为那是在尚未提交的事务中。
我从未见过实现此功能...但是,如果您想了解我在说什么,请在此处查看并行测试项目:https://github.com/moilejter/examples.git