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

Nik*_*Nik 3 java junit spring

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

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

    @Test
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Joh*_*n B 7

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

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

这个答案更好地解释了这一点。