DAO的单元测试

Posted

技术标签:

【中文标题】DAO的单元测试【英文标题】:Unit testing of DAO 【发布时间】:2013-07-09 05:07:24 【问题描述】:

这是我第一次进行单元测试,所以我试图找到有关如何对 DAO 进行单元测试的参考资料。你们能不能举一个简单的setUpBeforeClasssetUphow to test a method that inserting new data in database using model for this 的例子。只是一个使用简单模拟的简单示例。感谢您的考虑

【问题讨论】:

对于什么编程语言?使用什么单元测试框架? 我不确定您是否在寻找。一个简单的谷歌搜索会引发很多关于 SO 的问题和答案,以及很多关于这样做的策略的文档。 @zerkms 我使用的是 java,如果我没记错的话,还有 mockito @PreetSangha 我已经尝试过谷歌,但我搜索的内容并没有填补我缺乏知识的空白,这就是为什么我试图在这里索取样本,以便我可以按照其中的步骤进行操作 DAO 是一个集成类,因此使用模拟对其进行测试几乎没有价值(您要模拟 SQL 结果集吗?)。毕竟,DAO 只有从外部系统检索数据的逻辑。 【参考方案1】:

使用模拟对象来执行单元测试的想法让我觉得很奇怪,因为你所做的只是测试模拟对象而不是真实对象。如果您认为您需要使用模拟对象来模拟数据库访问,那么您的整个架构就是错误的。我个人使用 3 层架构构建我的所有软件,在该架构中,我可以在业务层中拥有任意数量的对象,但在数据访问层中只有 1 个对象。因此,如果我想用虚拟数据库访问交换真实数据库访问,我应该在哪里进行更改?我的业务层中的所有 200 多个对象,或者只是数据访问层中的 1 个对象?当我真正需要做的只是更改一个对象时,为什么还要实现一种机制来更改应用程序中的每个对象?

控制器旨在进行集成测试,而不是单元测试。但是测试金字塔规定单元级别应该是焦点所在,因此默认情况下会吸引人们。

断言在任何情况下都不应失败。 如果它们在您的测试中失败,则表明存在逻辑错误。 基本上,如果你的函数正在执行“assert(0)”而不是返回错误代码,那么应该重写该函数。

您能否对类定义进行大量更改——甚至丢弃整个内容并用完全不同的实现替换它——而不影响使用该类对象的任何代码?

不幸的是,源自 Java 等僵化语言的各种模式已经发生,依赖注入已经传播并被提倡为一种跨语言的最佳实践,以夸大灵活性和延展性的好处。

参考文献

Dependency Injection is Evil - Tony Marston

Test Induced Design Damage - David Heinemeier Hansson

TDDing Getters and Setters Considered Harmful

Why Getter and Setter Methods are Evil

Dependency injection is not a virtue in Ruby (DHH)

TDD the RITE Way – javascript Scene – Medium

5 Common Misconceptions About TDD & Unit Tests – JavaScript Scene – Medium

Ned Batchelder: tl;dw: Stop mocking, start testing

ACCU :: Mocks are Bad, Layers are Bad

Google Testing Blog: Testing on the Toilet: Don’t Overuse Mocks

【讨论】:

以上是关于DAO的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

DAO(又名存储库)是不是应该进行单元测试?

如何组织或分类单元测试 DAO 搜索方法

如何在 Java 中对 DAO 应用单元测试

对单元测试 DAO 的怀疑

在 DAO 单元测试期间恢复数据的策略是啥?

内存中带有 derby 的单元测试数据库层 DAO