Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @BeforeAll和@Transaction不起作用-数据库端的更改未回滚_Java_Spring_Junit - Fatal编程技术网

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

Java @BeforeAll和@Transaction不起作用-数据库端的更改未回滚,java,spring,junit,Java,Spring,Junit,我正在尝试使用@Transactional在测试后回滚和@BeforeAll设置测试对象来测试我的应用程序: @EnableJpaRepositories @SpringBootTest @Transactional public class UserScoreTest { @BeforeAll public static void init() { userRepository.save(user); } @Test ... } 问题似

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

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

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

有人知道这是想要的行为还是bug吗


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

@beforeach对每个@Test执行,@BeforeAll在开始时对所有@Test只执行一次。

@beforeach对每个@Test执行一次,@BeforeAll一开始只执行一次@Test

我认为你的概念是错误的

在常见测试场景中,任何@Autowired依赖项,如您的userRepository,都不应该是静态的。我假设它是静态的,因为您从静态方法引用它

只需在注释之前考虑,并且由于@事务性注释,每一个测试将在末端自动滚回。

主要情况如下:

跑@beforeal

对于每个@Test注释:

  • 开始交易
  • 跑@之前
  • 运行@Test
  • 回滚事务
@BeforeAll的目的是对整个测试类只做一次某些工作。我可以想到一种可能的场景来设置RequestContextHolder或SecurityContextHolder的值,但我知道在其他线程中会丢失这些值(如果@Test创建了一些)。我很少使用@beforeal。同样的原则也适用于@Parameterized测试,这些测试必须在静态方法之上有@Parameters注释。这是因为@RunWith中的运行程序在实际初始化测试之前必须知道要使用多少测试和哪些参数


@BeforeAll超出了交易范围。

我认为你的概念是错误的

在常见测试场景中,任何@Autowired依赖项,如您的userRepository,都不应该是静态的。我假设它是静态的,因为您从静态方法引用它

只需在注释之前考虑,并且由于@事务性注释,每一个测试将在末端自动滚回。

主要情况如下:

跑@beforeal

对于每个@Test注释:

  • 开始交易
  • 跑@之前
  • 运行@Test
  • 回滚事务
@BeforeAll的目的是对整个测试类只做一次某些工作。我可以想到一种可能的场景来设置RequestContextHolder或SecurityContextHolder的值,但我知道在其他线程中会丢失这些值(如果@Test创建了一些)。我很少使用@beforeal。同样的原则也适用于@Parameterized测试,这些测试必须在静态方法之上有@Parameters注释。这是因为@RunWith中的运行程序在实际初始化测试之前必须知道要使用多少测试和哪些参数


@BeforeAll超出了事务范围。

我认为您的问题是@Transactional只在Spring“Bean”的实例方法上有效,而不在静态方法上有效。这就是为什么它适用于@beforeach实例方法,而不适用于@BeforeAll静态方法

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


更好地解释它。

我认为您的问题是@Transactional只在Spring“Bean”的实例方法上有效,而不在静态方法上有效。这就是为什么它适用于@beforeach实例方法,而不适用于@BeforeAll静态方法

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


更好地解释它。

没错,但这不是我问题的答案,这更多的是评论而不是答案。没错,但这不是我问题的答案,这更多的是评论而不是答案。谢谢你的帮助。我使用“@BeforeAll”创建了可以在所有测试中使用的bean。例如,创建两个玩家,创建一个游戏,然后在不同的测试中玩。在每次测试之前创建一个玩家和一个游戏是没有意义的,所以我认为使用它没有错,但在这里不起作用。正如“@John B”所说,解决方法是使用布尔值创建“@beforeach”,并仅在需要帮助时执行它。我使用“@BeforeAll”创建了可以在所有测试中使用的bean。例如,创建两个玩家,创建一个游戏,然后在不同的测试中玩。在每次测试之前创建一个玩家和一个游戏是没有意义的,所以我认为使用它没有错,但在这里不起作用。正如“@John B”所说,解决方法是使用布尔值创建“@beforeach”,并只执行一次