【问题标题】:Spring and JUnit, the difference of annotating classes and methods with @Transaction?Spring和JUnit,用@Transaction注解类和方法的区别?
【发布时间】:2012-10-06 16:36:03
【问题描述】:

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

【问题讨论】:

    标签: spring transactions spring-transactions


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-25
        • 2014-10-04
        • 2012-05-17
        • 1970-01-01
        • 1970-01-01
        • 2019-01-08
        • 1970-01-01
        • 2019-03-31
        相关资源
        最近更新 更多