java - 在没有静态测试数据库的情况下,如何使 DAO 类的单元测试不那么脆弱?

标签 java hibernate unit-testing junit dbunit

这是扫描仪:

我正在开发一个 DAO 对象,它使用 hibernate criteria API 来形成许多复杂的查询,以在数据库上执行某些任务(例如跨多个字段的关键字搜索)。

我们需要对其进行单元测试,以确保生成的查询对于各种场景都是正确的。测试它的一种方法(这可能是更好的方法)是通过在最后检查它并模拟数据库交互来测试 hibernate 标准是否正确创建。然而,这是不可取的,因为首先它有点作弊(它只是重复代码将要执行的操作),而且它不会检查标准本身是否会导致 hibernate 状态呕吐,或者当它进入数据库时​​会导致问题。

然后使用的选项是针对测试数据库运行查询。然而,由于历史原因,没有静态测试数据库(例如,代码作为代码的一部分 checkin 的数据库),并且我的项目的职权范围不允许我开始创建一个静态测试数据库,我们必须满足于针对使用生产数据定期刷新的共享开发数据库。

当这些刷新发生时,测试背后的数据也可能发生变化,这将使我们的单元测试变得脆弱。我们可以通过在测试中不使用确切的数字来克服这个问题,但这并不是真正足够的测试。

那么问题是:在这种情况下人们会做什么来减少测试的脆弱性?我想到的一个选择是运行执行相同查询的 native SQL(行为上 - 它不必与 hibernate 生成的查询完全相同)来获取预期的数字,然后运行 ​​DAO 版本来查看如果匹配的话。这样,查询的行为就可以始终在初始 native SQL 中实现,并且您将始终获得正确的数字。

任何对此的反馈或有关如何管理这种情况的其他想法将不胜感激。

A.

更新:

关于 hsqldb/h2/derby 建议,我很熟悉它们,但公司还没有准备好走这条路,只在一个测试用例上零碎地做是不合适的。

关于我之前的建议,我想详细说明一下 - 考虑这种情况:

我想确保相对复杂的关键字搜索返回 2100 个“John Smith”匹配项。

为了找到预期的数字,我会分析我的数据库并使用 SQL 查询找出该数字。将该查询作为测试的一部分以便您始终知道您正在测试条件的行为有什么缺点?

所以基本上问题是:如果由于某种原因您无法拥有用于测试的静态数据集,您将如何以非脆弱的方式执行集成测试?

最佳答案

一种方法可能是使用内存数据库,例如 Apache DerbyHSQLDB ,并在测试开始之前使用 DBUnit 预先填充数据。

更新:这是一个不错的 article关于该方法。

关于java - 在没有静态测试数据库的情况下,如何使 DAO 类的单元测试不那么脆弱?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7496988/

相关文章:

Java ResultSet 关闭如何修复

java - 你是直接通过http传递hibernate/jpa实体对象还是有更好的选择?

java - MVP 和数据加载

java - 奇怪的泛型行为。早早被抹杀?

java - Hibernate 由 : java. sql.SQLException 引起:ORA-00942:表或 View 不存在

mysql - 如何处理 org.hibernate.exception.ConstraintViolationException,我使用 try catch 但它不起作用

c# - 使用 Moq 和 NUnit ,什么是编写方法/更好的语法?

unit-testing - 单独的类与方法

javascript - stub setTimeout 函数

java - JOptionPane 在 JPanel 中不能正常工作