【问题标题】:Spring testing DB rollback春季测试数据库回滚
【发布时间】:2020-03-29 11:23:15
【问题描述】:

我是#spring 新手,在运行一些测试时遇到了一些问题。我有一些带有以下代码的测试类,它们应该回滚我的(在内存 h2 中)数据库:

    @Autowired
    PlatformTransactionManager txm;

    TransactionStatus txstatus;

    @BeforeEach
    public void setupDB() {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
        txstatus = txm.getTransaction(def);
        assumeTrue(txstatus.isNewTransaction());
        txstatus.setRollbackOnly();
    }

    @AfterEach
    public void rollback() {
        txm.rollback(txstatus);
    }

我的问题是,如果一个测试类已经完成,我会得到一个 JdbcSQLIntegrityConstraintViolationException(唯一索引或主键冲突:..),因为我的数据库没有相应地回滚并且再次执行插入语句,因为数据库没有得到清除。有没有人有提示如何解决这个问题?有没有办法回滚插入或在插入完成后不做插入?

【问题讨论】:

    标签: java spring spring-boot junit


    【解决方案1】:

    你可以用

    注释你的测试类
    @Transactional
    

    Spring 将处理所有事情(这意味着每个测试都将在自己的事务中运行,之后会回滚)。

    你也可以使用

    @DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)
    

    但这很重,因为必须重新创建整个 Spring 上下文。

    【讨论】:

      【解决方案2】:

      一个简单的解决方案是使用DirtiesContext 注释。此注释有几个选项。您可以在测试类中使用以下行:

      @DirtiesContext(classMode = ClassMode.BEFORE_CLASS)
      

      上下文将在测试类执行之前被删除并重新创建。

      【讨论】:

      • 非常感谢您的回答。不知何故,这并没有改变任何东西......
      猜你喜欢
      • 2012-02-01
      • 1970-01-01
      • 2023-03-21
      • 2011-09-26
      • 2012-09-12
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多