3

我想了解,如果我用@Transactional 注释我的junit 类,Spring 将只创建一个事务,该事务将在我的@Test 方法之间共享并在最后回滚。相反,如果我用@Transactional 标记每个@Test,则会在@Test 的基础上创建和回滚一个新事务。我在官方文档(链接)中没有完全找到预期的行为。

4

2 回答 2

4

放在@Transactional一个类级别上相当于把它放在每个测试方法上。

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

于 2012-10-06T19:46:56.523 回答
1

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

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

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

于 2012-10-07T12:09:43.730 回答