有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

每次使用Spring Boot后java回滚事务

我使用的是BDD测试框架Cucumber和Spring Boot 2.5。 我想在每次事件发生后回滚事务或重置数据库。我使用的是H2数据库,由动态生成的数据填充。 我尝试了@Transactional,但它不起作用,@DirtiesContext的速度变慢了


共 (1) 个答案

  1. # 1 楼答案

    实现这一点的方法是使用PlatformTransactionManager在每个场景之前启动事务,并在每个场景之后回滚。这基本上就是TransactionalTestExecutionListener在执行用@Transactional注释的JUnit测试类时所做的事情

    在Cucumber中,可以使用@Before@After钩子来实现这一点。因为您可能不希望对每个场景都这样做,所以可以选择将钩子设置为有条件的,以便它们仅在以正确的方式标记场景时执行

    例如:

    @txn
    Feature: Search
    
      Background:
        Given there is a user
    
      Scenario: Find messages by content
        Given a User has posted the following messages:
          | content            |
          | I am making dinner |
          | I just woke up     |
          | I am going to work |
        When I search for "I am"
        Then the results content should be:
          | I am making dinner |
          | I am going to work |
    
    public class SpringTransactionHooks implements BeanFactoryAware {
    
        private BeanFactory beanFactory;
        private TransactionStatus transactionStatus;
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            this.beanFactory = beanFactory;
        }
    
        @Before(value = "@txn", order = 100)
        public void startTransaction() {
            transactionStatus = beanFactory.getBean(PlatformTransactionManager.class)
                    .getTransaction(new DefaultTransactionDefinition());
        }
        
        @After(value = "@txn", order = 100)
        public void rollBackTransaction() {
            beanFactory.getBean(PlatformTransactionManager.class)
                    .rollback(transactionStatus);
        }
    
    }
    

    发件人:

    https://github.com/cucumber/cucumber-jvm/tree/main/examples/spring-java-junit5