Spring和JUnit,用@Transaction注释类和方法的区别?

Spring和JUnit,用@Transaction注释类和方法的区别?,spring,transactions,spring-transactions,Spring,Transactions,Spring Transactions,我想了解,如果我用@Transactional注释我的junit类,Spring将只创建一个事务,它将在@Test方法之间共享,并在最后回滚。然而,如果我用@Transactional标记每个单独的@Test,将创建一个新的事务,并在@Test的基础上回滚。我没有在官方文档()中找到预期的行为。将@Transactional放在类级别相当于将其放在每个测试方法上 我不认为有一种简单的方法可以实现您的第一个场景,即,所有测试的单一事务。我不确定这是否有多大意义,因为测试将以随机顺序执行,所以您不能

我想了解,如果我用@Transactional注释我的junit类,Spring将只创建一个事务,它将在@Test方法之间共享,并在最后回滚。然而,如果我用@Transactional标记每个单独的@Test,将创建一个新的事务,并在@Test的基础上回滚。我没有在官方文档()中找到预期的行为。

@Transactional
放在类级别相当于将其放在每个测试方法上


我不认为有一种简单的方法可以实现您的第一个场景,即,所有测试的单一事务。我不确定这是否有多大意义,因为测试将以随机顺序执行,所以您不能依赖于看到彼此的修改。当然,您始终可以通过单个事务从单个uber测试显式调用您的方法。

@Transactional
在JUnit测试用例级别,将在每个测试方法之前启动新事务,然后回滚

您不能轻易地在测试类开始时启动新事务并使其对整个类保持打开状态,至少Spring不支持这一点。您的第一个解决方法是使用
@BeforeClass
/
@AfterClass
对,但它们必须是
静态的
,因此您没有访问事务管理器的权限

但首先问自己一个问题,你为什么要这样做?听起来一个测试取决于另一个测试的输出或数据库副作用。这是测试中的一个大反模式,更不用说JUnit不能保证测试方法的执行顺序。也许您只需要在每个测试用例之前设置一个数据库<在Spring事务的上下文中执行之前的和之后的,因此您可以在那里使用它们