【问题标题】:Integration Test which simulates Exceptional / Rollback condition with AbstractTransactionalJUnit4SpringContextTests使用 AbstractTransactionalJUnit4SpringContextTests 模拟异常/回滚条件的集成测试
【发布时间】:2010-10-27 21:29:21
【问题描述】:

我有一个扩展 AbstractTransactionalJUnit4SpringContextTests 的 JUnit4 测试。我有一个使用@Transactional 标记为工作单元的业务对象。工作单元更新已通知用户的数据库,然后尝试向他们发送通知消息。我已经将方法配置为回滚 MailException (spring simple mail api),并模拟了 MailSender 以在调用它来验证回滚功能时抛出 SendMailException。

虽然在我的单元测试中,事务没有回滚,但我试图弄清楚是不是因为它参与了为我的实际测试方法打开的事务,因为那时测试方法还没有t 提交或回滚。代表工作单元的方法被配置为需要一个新事务,我尝试在 spring config 中配置两个事务管理器并指定测试用例使用第二个事务管理器。不管怎样,当我检查单元测试方法中的数据时,它仍然被修改,即使它应该被遇到邮件发送异常的应用程序代码回滚。

任何见解都会很棒。

【问题讨论】:

    标签: spring transactions


    【解决方案1】:

    我使用了一个带有以下注释的基类,并从中扩展了我的实际测试类:

    @ContextConfiguration(locations="classpath:applicationContext-test.xml")
    @TransactionConfiguration(transactionManager="txManager", defaultRollback=true)
    @Transactional
    public abstract class IntegrationTestBase extends AbstractTransactionalJUnit4SpringContextTests
    {
        //...Some setup stuff with @Before
    }
    

    扩展此类的测试类标有@Transactional -annotation,但我不确定它是否有必要。无论如何,它似乎可以解决问题,因为日志表明每次测试后都会发生回滚,并且在一个测试方法中所做的更改在另一个测试方法中不可见。

    15:53:10,564 (6923) [信息] org.springframework.test.context.transaction.TransactionalTestExecutionListener:280 - 在测试上下文的测试执行后回滚事务 [[TestContext@6dadfbe3 testClass = org.some.SomeTestClass,位置 = 数组['classpath:applicationContext-test.xml'], 测试实例 = org.some.SomeTestClass@1f0936a1, 测试方法 = testSomething@SomeTestClass, testException = [null]]]

    另见@Transactional -annotations 属性 rollbackFor、rollbackForClassName、noRollbackFor 和 noRollbackForClassName

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2020-12-16
      • 2012-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多