【问题标题】:spring, transaction and unit tests - how to set transaction on class levelspring,事务和单元测试 - 如何在类级别设置事务
【发布时间】:2011-07-16 00:07:05
【问题描述】:

我正在使用 Spring junit runner,它的事务功能可以在每次测试之前和之后启动和回滚事务。

但是我有一个带有大量数据库初始化的测试类,我希望每个测试(方法)都在事务范围内运行,即在测试开始时启动事务并在类中的所有测试完成后回滚.

【问题讨论】:

    标签: unit-testing spring transactions junit


    【解决方案1】:

    您是否知道在一个事务中包含类中的所有测试方法会带来很多麻烦?基本上,您不能再依赖于拥有干净的数据库,因为其他测试方法会在此过程中对其进行修改。而且因为没有指定测试方法的顺序,所以你也不能依赖它(所以你永远不会知道数据库到底保存了什么)。本质上你放弃了所有测试事务支持,你唯一的保证是运行整个测试用例后,数据库将保持干净(因此其他测试用例不会受到影响)。

    你的抱怨结束了。我认为 Spring 不支持这种开箱即用的行为(部分原因是上面强调的原因)。但是,如果您仔细查看 TransactionalTestExecutionListener,它负责 Spring 驱动的测试中的事务支持。

    @Override
    public void beforeTestMethod(TestContext testContext) throws Exception {
        //...
        startNewTransaction(testContext, txContext);
    }
    

    和:

    @Override
    public void afterTestMethod(TestContext testContext) throws Exception {
        //...
        endTransaction(testContext, txContext);
        //...
    }
    

    现在仔细观察,有未实现的 beforeTestClassafterTestClass... 您将在 Spring 参考文档的 9.3.5 章节中找到详细说明如何将它们连接起来。提示:编写你自己的监听器并使用它来代替TransactionalTestExecutionListener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-21
      相关资源
      最近更新 更多