使用AbstractTransactionalJUnit4SpringContextTests模拟Exceptional / Rollback条件的集成测试

时间:2010-10-27 21:29:21

标签: spring transactions

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

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

任何见解都会很棒。

1 个答案:

答案 0 :(得分:0)

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

@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)[INFO]   org.springframework.test.context.transaction.TransactionalTestExecutionListener:280    - 在测试执行测试上下文后回滚事务   [[TestContext @ 6dadfbe3 testClass =   org.some.SomeTestClass,位置   = array ['classpath:applicationContext-test.xml'],   testInstance =   org.some.SomeTestClass@1f0936a1,   testMethod =   testSomething @ SomeTestClass,   testException = [null]]]

另见@Transactional -annotations attributes rollbackFor,rollbackForClassName,noRollbackFor& noRollbackForClassName