在测试中使用回滚手动执行事务中的代码

时间:2018-09-20 09:17:08

标签: spring spring-boot transactions integration-testing spring-transactions

我们使用的是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个事务。

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