我有一个JUnit4测试,它扩展了AbstractTransactionalJUnit4SpringContextTests。我有一个业务对象,我已将其标记为@Transactional的工作单元。工作单元更新已通知用户的数据库。然后尝试向他们发送通知消息。我已经将该方法配置为回滚一个MailException(spring simple mail api)并模拟一个MailSender,当它被调用以验证回滚功能时抛出SendMailException。
在我的单元测试中,事务没有回滚,我试图弄清楚是不是因为它参与了为我的实际测试方法打开的事务,因为此时测试方法还没有提交或回滚。表示工作单元的方法配置为需要新事务,我尝试在spring config中配置两个事务管理器并指定测试用例使用第二个事务管理器。无论如何,当我检查单元测试方法中的数据时,它仍然会被修改,即使它应该被遇到邮件发送异常的应用程序代码回滚。
任何见解都会很棒。
答案 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