【问题标题】:How to test rollback is working as expected?如何测试回滚是否按预期工作?
【发布时间】:2011-12-29 15:51:50
【问题描述】:

我正在尝试编写一个集成/单元测试,其中在执行保存后将异常应用于 DAO - 以验证回滚行为。我的想法是创建一个 Spring AOP 方面 - 并将 @AfterReturning 建议应用于 DAO 上的“保存”方法。

DAO 已通过 @Transactional 建议代理。

这似乎是正确的方法吗?

到目前为止,我正在尝试使用 Spring ProxyFactory - 在单元测试中代理 DAO。

例如

 ProxyFactory pf = new ProxyFactory(new MyFaultInjectingAspect());
 pf.setTarget(myDao);
 MyDao proxiedDao = (BookmarkDao) pf.getProxy();

谢谢。

仅供参考:与此有关Is it ok to use DataSourceTransactionManager for ORM persistence instead of HibernateTransactionManager?

【问题讨论】:

  • 您是否有机制使事务失败并因此导致回滚?你有办法让你的测试设置这个失败吗?
  • 问题与如何创建该机制有关。我正在考虑使用方面来注入导致失败的异常。

标签: java spring transactions spring-aop


【解决方案1】:

【讨论】:

  • 并非如此。这提供了在每次测试结束时自动回滚的机制。不是测试回滚是否由被测代码完成的机制。
【解决方案2】:

在您的数据库方面,您可以使用 select for update 来发出锁定。

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html

然后尝试使用您的应用程序提交,您应该会看到事务回滚异常,但原因不同。

更新链接。

【讨论】:

    【解决方案3】:

    我猜还有其他没有任何 AOP 的方法真正检查数据库中没有写入任何内容:

    如果您有一个测试可以验证(如果没有异常)事务已提交,并且实体已写入数据库,那么您只需要简单的第二次测试。

    在此测试中,您必须执行相同的操作,但有例外。然后您必须只验证注释已写入数据库。所以你不需要 AOP 的东西,你的测试变得更有意义,因为它最终测试了你真正想要的东西。 (希望我理解正确,那个角色返回只是禁止数据库更改的技术。

    【讨论】:

    • +1。谢谢你的建议。我实际上是在尝试确认回滚 is 工作。但也许测试太复杂了。我可能会尝试不同的方法。
    猜你喜欢
    • 2016-05-21
    • 1970-01-01
    • 2016-03-09
    • 2020-11-12
    • 2020-10-30
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多