java - Spring测试数据库回滚

标签 java spring spring-boot junit

我是 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 (唯一索引或主键冲突:..),因为我的数据库没有相应地回滚,并且再次执行插入语句,因为数据库没有得到已清除。有人知道如何解决这个问题吗?有没有办法回滚插入或在完成插入后不进行插入?

最佳答案

您可以使用

注释您的测试类
@Transactional

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

您还可以使用

@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD)

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

关于java - Spring测试数据库回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60913470/

相关文章:

java - Spring Boot Web应用程序 : Unable to load class: com. ibm.as400.access.AS400JDBCDriver

java - 准备响应主体的逻辑应该在@Service还是@Controller上?

java - jquery 和 servlet 与 ajax 的通信

java - 当任何一个 ListArray 具有重复元素时,计算 ListArray 的数量

java - Spring Controller 、Jackson 数据格式和 Azure Blob 存储 v10

java - 使用 Java Spring 3.0 @NumberFormat 注解

maven - 从 Gradle 构建内部复制 Maven "dependencyManagement"标签

java - GWT 中的多页环境

Java获取输入直到ctrl+z

java - 构建基于 Spring 的应用程序的蓝图