【问题标题】:Debugging JUnit Tests in a Hibernate driven Spring Application在 Hibernate 驱动的 Spring 应用程序中调试 JUnit 测试
【发布时间】:2013-09-05 11:51:40
【问题描述】:

也许这已经被回答了,但我没有找到任何建议...... 我的项目是一个 Spring Utility 项目,我使用的数据库是 MySQL,为了持久性,我将 Hibernate 与 c3p0 连接池结合使用。我在 spring 3.2 和 hibernate 3.5 上。 所以这就是我想要做的: 我想调试一个 JUnit 测试,跳过一些持久性功能(保存、更新等),然后通过 SQL 手动检查数据库中的条目。由于 JUnit 测试总是在事务中运行,我无法检查数据库中的条目,因为每次测试完成时都会发生回滚/永远不会发生提交。

有没有办法伪造交易存在,或者在 JUnit 测试期间绕过它们?

【问题讨论】:

  • 事务回滚后需要下断点吗?如果你可以在事务回滚之前将断点放在测试中,那么你有更多的选择。
  • 不,在回滚发生之前。我需要在事务期间查看数据库。但是我越想越觉得这是一个概念问题,因为 junit 的实际意义是,它们总是会因为不影响其他测试而回滚……所以需要事务:​​- /

标签: java spring hibernate debugging junit


【解决方案1】:

也许您可以在调试会话期间刷新 Hibernate 中的事务并强制 Spring/Hibernate 写入数据库。

或者您可以关闭调试会话的事务。

【讨论】:

  • 不幸的是,刷新不是解决方案,因为“刷新”实体仍在事务中,对我的 sql 查询不可见。但是为我的测试环境完全关闭事务可能是一个解决方案。我试试看!
【解决方案2】:

在事务发生时查看数据库的最佳方法是使用允许脏读的隔离级别进行查询,而不是虚假事务的存在。执行此操作的机制因数据库而异,在 MySQL 中您可以使用

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

在查询之前。

显然,您还需要在测试期间强制 Hibernate 刷新对数据库的写入,并在刷新后设置断点。

【讨论】:

  • 是的。事务隔离是关键词!我现在已经将我的测试环境转移到了一个 h2 数据库,并在研究他们的文档时发现了这一点。 “读取未提交”是帮助我更好地调试测试的设置!无论如何谢谢;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2018-07-22
  • 1970-01-01
  • 2012-11-23
相关资源
最近更新 更多