我希望了解一下,如果我在我的junit类上使用@Transactional注解,Spring将只创建一个事务,该事务将在我的@Test方法之间共享,并在结束时回滚。而如果我将每个单独的@Test标记为@Transactional,则将基于@Test创建一个新的事务,并在@Test基础上回滚。我在官方文档中没有找到预期的行为(link)。
在类级别上使用 @Transactional
相当于在每个测试方法上都使用它。
我认为没有简单的方法可以实现您的第一个场景,即所有测试都使用单个事务。无论如何,我不确定这是否有意义,因为测试将以随机顺序执行,因此您不能依赖于看到彼此的修改。当然,您始终可以从单个 uber-test 中显式调用您的方法,并使用单个事务。
@Transactional
在 JUnit 测试用例类级别上将在每个测试方法之前启动新事务,并在之后回滚。
你不能轻易地在测试类开始时启动新事务并保持整个类的开放状态,至少 Spring 不支持这样做。你的第一个解决方法是使用 @BeforeClass
/@AfterClass
对,但它们必须是 static
,因此你无法访问事务管理器。
但首先问问自己一个问题,为什么要这样做?听起来像是一个测试依赖于另一个的输出或数据库副作用。这是测试中的一个大反模式,更不用说 JUnit 不保证测试方法执行的顺序了。也许你只需要在每个测试用例之前设置一个数据库?@Before
和 @After
在 Spring 事务的上下文中执行,所以你可以在那里使用它们。