java - @BeforeAll 和 @Transaction 不起作用 - 数据库端的更改不会回滚

标签 java spring junit

我正在尝试使用 @Transactional 来测试我的应用程序,以在测试后回滚,并使用 @BeforeAll 设置测试对象:

@EnableJpaRepositories
@SpringBootTest
@Transactional
public class UserScoreTest {
    @BeforeAll
    public static void init() {
       userRepository.save(user);
    }

    @Test
    ...
}

问题似乎是,一旦执行 @BeforeAll ,更改就会“提交”。

有人知道这是期望的行为还是错误吗?

我使用 @BeforeEach 解决了我的问题,然后在 @Test 中保存,它可以工作(测试后,所有内容都回滚),但我更愿意使用 @BeforeAll 设置一次。

最佳答案

我相信你的问题是@Transactional只适用于Spring“Bean”的实例方法,而不适用于静态方法。这就是为什么它适用于 @BeforeEach 实例方法,但不适用于 @BeforeAll 静态方法。

解决这个问题的一种方法是使用@BeforeEach,但有一个 boolean 字段来存储它是否已经完成一次。如果您的测试以多线程方式运行,请不要忘记解决线程问题。

This answer解释得更好。

关于java - @BeforeAll 和 @Transaction 不起作用 - 数据库端的更改不会回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58657587/

相关文章:

java - 为什么 JUnit 中的 @Rule 注释字段必须是公开的?

java - 如何在java中的嵌套映射中使用单个键来表示多个条目

java - 选择 BETWEEN 日期返回错误结果

java - 如何在android中创建年龄计算方法的方法

java - Spring 与 MyBatis : expected single matching bean but found 2

java - 无法在 JPA + Spring 中保留实体,没有错误

java - Marshaller 必须支持 Spring Batch 拆分作业中编码对象错误的类

java - JUnit 抛出 IllegalArgumentException

java - setUp() 和 setUpBeforeClass() 的区别

java - 当其余服务返回字符串时,jquery ajax 调用返回错误