kul*_*uda 2 java testng spring jpa transactions
我正在将 TestNG 与 Spring 和 JPA 一起使用。到目前为止,我正在使用我的测试类来测试数据库内容,该类扩展了AbstractTransactionalTestNGSpringContextTests. 随着@TransactionConfiguration(defaultRollback = true)一切工作正常,我并不需要有关清理卡里。Spring 在我的每个测试方法的开头创建一个默认事务,然后回滚。这是解决著名的“事务性测试被认为有害”问题的一个非常巧妙的技巧。
不幸的是,我需要这个类中的一种方法(一个测试)没有这个默认事务。这是因为此测试方法模拟批处理,并且我在其中有多个独立于生产的事务。我能够模拟和解决问题的唯一方法是配置这些内部事务,Propagation.REQUIRES_NEW但我不想在生产代码中使用。有没有一些方法来禁用Spring的事务对我特别的测试方法(所以我并不需要使用Propagation.REQUIRES_NEW,但Propagation.REQUIRED在我的服务方法)?
我知道你已经解决了你的问题,但是对于将来会来这里的人......
不幸的是,似乎无法在使用@Transactional注释的测试中禁用现有事务。
恕我直言,这里的 Spring 方法非常不灵活。但是有一个解决方法可以解决您的问题。在 SpringTransactionTemplate类中封装所需的逻辑就足够了。这将确保您的测试用例中的代码将在新事务中启动。
个人建议:从我的角度来看,最好和最灵活的方法是从一开始就放弃@Transactional测试并在每次测试之前将数据库设置为已知状态。通过这种方式,Spring 将以与生产中完全相同的方式管理事务。
没有怪癖,没有黑客,没有手动交易管理。
我知道@Transactional围绕单元测试使用“回滚”策略是一个诱人的想法,但它有太多陷阱。我建议阅读这篇文章Spring 陷阱:被认为有害的事务性测试。
当然,我不会在这里抱怨 @Transactional 本身——因为它极大地简化了生产代码中的事务管理。
| 归档时间: |
|
| 查看次数: |
5506 次 |
| 最近记录: |