我有一个方法,它使用一些 DAO 对数据库进行一些调用。
我应该使用模拟机制来避免管理数据库(因此模拟所有 DAO 方法)还是应该使用 dbunit(或其他等效方法)通过在内存中加载和初始化数据库(如 hsqldb)来进行测试?
这些对每种方法(模拟与 dbunit)有什么优缺点吗?
我有一个方法,它使用一些 DAO 对数据库进行一些调用。
我应该使用模拟机制来避免管理数据库(因此模拟所有 DAO 方法)还是应该使用 dbunit(或其他等效方法)通过在内存中加载和初始化数据库(如 hsqldb)来进行测试?
这些对每种方法(模拟与 dbunit)有什么优缺点吗?
你想测试数据库。我看不出在这种情况下 mock 有什么意义。一旦您知道 DAO 正在工作,那么将模拟注入到使用它们的服务中就很合适了。
同时,请测试您的数据库。您可以创建一个临时测试数据库,也可以使所有测试都具有事务性:设置测试工作单元、执行它、验证它、回滚它。
我会推荐使用模拟对象,一般来说数据库访问不是很高效并且花费很多时间,我们有一个包含 4000 多个单元测试的项目,运行完整的测试需要 3 个多小时,特别是考虑到设置和撕裂在每次测试前后访问数据库。
关于 dbunit 我使用了它,所以我不能说它是否好,但正如我所说的我会避免在单元测试中访问数据库,它应该仅限于逻辑单元。
这是一个很难明确回答的问题;但是,我的建议和我通常更喜欢的是针对嵌入式数据库或外部测试数据库(作为集成测试)测试 DAO 本身,以便您了解 DAO 针对某种读取数据库的正确功能。
然后对于使用 DAO 的组件,您可以模拟它以将您的测试与必须显式使用数据库分离。
这种方法的缺点是您必须有某种嵌入式或其他可用于测试的数据库。
你可以模拟你的 DAO 单元测试;但是,您并不能完全确定您的模拟将是数据库将提供什么的真实表示。
希望这可以帮助。