如何测试回滚是否按预期工作?

发布于 2024-12-15 16:16:27 字数 577 浏览 0 评论 0原文

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

DAO 已通过 @Transactional 建议进行代理。

这看起来是正确的方法吗?

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

例如,

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

谢谢。

仅供参考:与此相关 可以使用 DataSourceTransactionManager 代替 HibernateTransactionManager 进行 ORM 持久化吗?

I am trying to write an integration/unit test where an exception is applied to a DAO after a save has been performed - in order to validate the rollback behaviour. My thoughts were to create a Spring AOP aspect - and apply @AfterReturning advice to the 'save' method on the DAO.

The DAO is already proxied via @Transactional advice.

Does this seem like the right way to go ?

So far I'm trying to use a Spring ProxyFactory - to proxy the DAO in the unit test.

E.g.

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

Thank you.

FYI: relates to this Is it ok to use DataSourceTransactionManager for ORM persistence instead of HibernateTransactionManager?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

如何视而不见 2024-12-22 16:16:27

从数据库端,您可以使用 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

并尝试提交您的应用程序,您应该看到事务回滚例外,但原因不同。

更新了链接。

From your DB side you can issue a lock by using 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

And try to commit with your application, you should see a transaction rolled back exception, but with different reason.

updated link.

胡渣熟男 2024-12-22 16:16:27

我想还有其他没有任何 AOP 的方法可以真正检查数据库中是否未写入任何内容:

如果您有一个测试来验证(如果没有例外)事务是否已提交,并且实体写入DB,那么只需要简单的第二次测试即可。

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

I guess there is other approach without any AOP that really checks that nothing is written in the DB:

If you have a test that verifies (if there is no exception) that the transaction is commited, and the entity is written to the DB, then you only need simple second test.

In this test you must do the same but with exception. And then you must only verify that noting is written to the DB. So you do not need the AOP Stuff, and your test becomes more meaningful because it test in the end what you really want. (I hopefully understand it right, that role back is only the technique to prohibit the database change.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文