Spring 和 JUnit,使用 @Transaction 注解标记类和方法有什么区别?

3
我希望了解一下,如果我在我的junit类上使用@Transactional注解,Spring将只创建一个事务,该事务将在我的@Test方法之间共享,并在结束时回滚。而如果我将每个单独的@Test标记为@Transactional,则将基于@Test创建一个新的事务,并在@Test基础上回滚。我在官方文档中没有找到预期的行为(link)。
2个回答

4

在类级别上使用 @Transactional 相当于在每个测试方法上都使用它。

我认为没有简单的方法可以实现您的第一个场景,即所有测试都使用单个事务。无论如何,我不确定这是否有意义,因为测试将以随机顺序执行,因此您不能依赖于看到彼此的修改。当然,您始终可以从单个 uber-test 中显式调用您的方法,并使用单个事务。


1

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

你不能轻易地在测试类开始时启动新事务并保持整个类的开放状态,至少 Spring 不支持这样做。你的第一个解决方法是使用 @BeforeClass/@AfterClass 对,但它们必须是 static,因此你无法访问事务管理器。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接