当前位置: 首页 > 知识库问答 >
问题:

Manualy使用回滚执行测试中事务中的代码

壤驷高洁
2023-03-14

我们使用的是spring Boot2,在集成测试中,我们需要在事务中手动执行一些代码,在事务结束时和断言之后,我们希望回滚该事务。

我们使用显式定义的事务而不是@Transactional,因为有时我们需要在Test2事务中执行。

@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个事务。

共有1个答案

公孙阳羽
2023-03-14

将对每个TransactionStatus的引用存储在AtomicReference中,并在测试后用事务管理器回滚它们。

@Test
void test() {
  final AtomicReference<TransactionStatus> first = new AtomicReference<>();
  final AtomicReference<TransactionStatus> second = new AtomicReference<>();
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      // some code in transaction
      first.set(status);
    }
  });

  // transaction 2
  transactionTemplate.execute(new TransactionCallbackWithoutResult() {
    @Override
    protected void doInTransactionWithoutResult(TransactionStatus status) {
      // some code in transaction
      second.set(status);
    }
  });
  transactionTemplate.getTransactionManager().rollback(first.get());
  transactionTemplate.getTransactionManager().rollback(second.get());
}
 类似资料:
  • 我正在努力做一个工作junit测试,以回滚在骆驼路由过程中发生的操作。 我有一个骆驼路线设置,可以监听目录。它需要一个csv文件。当csv文件出现时,它会创建新的SearchAnalytics数据。它会在csv文件中的每一行向表中添加新行。 我放的默认的Spring事务方法似乎不适用于骆驼路由上发生的操作。 下面的代码可以工作。但是它会永久保存数据,并且不会回滚插入。这意味着测试只会通过一次,除非

  • 问题内容: 我正在运行一个简单的JUnit测试,又是一个应用程序DAO。问题是我总是得到: JUnit测试是: 如你所见,我明确声明不回滚此方法。 Spring JUnit支持是否总是将rollback设置为true? 问题答案: 它应该可以正常工作,就像你期望的那样,但是可能是你在被测类中打开了另一个事务,或者某个地方有其他功能/或错误。 顺便说一句,这个注释应该是足够的:

  • 测试将创建的数据保存在H2测试数据库中,随后的测试在测试套件中执行时将失败。 我如何用事务绕过类的所有测试,并在类的所有测试执行后回滚所有数据库修改?

  • 问题内容: 我对各种服务进行了一些集成测试,这些测试扩展了以下基类: 在大多数情况下,这可以正常工作,但是我有一个服务类,该类具有定义的事务。看来这些事务没有回滚(因为它们是嵌套事务,并且显然是在“外部”事务中提交的?)。至少根据测试日志,回滚“外部”(测试用例级别)事务。提交的事务弄乱了一些以后的测试,因为它们已经更改了测试数据。 我可以通过强制测试在测试之间重新创建和重新填充数据库来解决此问题

  • 问题内容: 我测试我的DAO和服务没有问题,但是当我测试s或s时,我想回滚事务并且不影响我的数据库。 我正在使用我的服务来管理交易。我想知道,是否有可能知道交易是否正常,但是回滚它以防止更改数据库? 这是我的测试: 问题在于该测试将失败,因为事务已回滚,但是插入正常!如果删除,则测试通过,但新记录将插入数据库。 现在可以正确测试通过,但是回滚将被忽略,并且记录将插入到数据库中。显然,我已经在myS