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