关于单元测试:对象模拟是否被广泛使用?

关于单元测试:对象模拟是否被广泛使用?

Is object mocking used extensively?

我很好奇你们中有多少人将对象的模拟(如JMock,NMock,RhinoMocks等框架与单元测试框架结合在一起)纳入您的日常开发过程。 你有什么经验?

您会看到,我是在GIS(地理信息系统)平台上开发的,该平台的大部分工作都与某种处理数据的方式有关。 由于其数据对象模型非常复杂(许多类和接口,全部基于COM),因此模拟起来也非常困难且麻烦。 在这种情况下,编写测试套件时,模拟会产生大量开销。 我想知道是否有人处于类似情况,或者仅仅是,嘲笑(无论您处于何种情况)如何为您服务。


在我最近从事的项目中,我们在单元测试方法中广泛使用了模拟对象。该项目是100%Java,大小适中(大约100,000行未注释的代码)。它是基于Swing的桌面应用程序-我们发现测试用户界面逻辑的唯一有效方法是通过MVC变体设计,该设计允许我们使用模拟对象代替实际的Swing用户界面类进行自动化测试。我们还在数据访问层(Hibernate / DAO)的测试中广泛使用了模拟。

在用户界面使用中,Mocks易于构建。应用程序的设计(Fowler Passive View)可以轻松地包含模拟。在测试数据访问层时使用的模拟不是这种情况。但是我可以说这显然值得付出努力。实际上,大多数"努力"实际上都集中在提出一种可重用的解决方案上,该解决方案将开发人员创建每个单独的模拟程序所需的工作减至最少。我建议花些时间研究一下适合您情况的方法,该方法可以轻松模拟GIS数据层。那-或只是手动模拟每个课程。无论哪种方式,运行基于模拟的自动化单元测试的能力都是值得的...


在我的情况下,模拟工作确实很好。但是我使用的是Python,它是如此动态,它使涉及测试的许多事情变得非常容易。

在像您这样的情况下,当应用程序主要由数据驱动时(据我所知),模拟可能没有那么有用。仅将数据传入并看着它出来就足以进行测试。我只是要确保应用程序足够模块化,因此该方法可以应用于相当小的组件。


Dave Bouman发起了一项计划,试图建立Mocks社区库,以用于ArcObjects相关的单元测试。他的博客和这个svn存储库包含与单元测试GIS系统相关的大量信息

http://blog.davebouwman.net/CategoryView,category,Unit%2BTesting.aspx

http://svn2.assembla.com/svn/arcdeveloper/TestingUtilities/trunk/


在我的情况下,模拟被非常广泛地使用。嘲笑通常用于具有外部依赖性的类,例如网络,数据库,文件系统。如果不使用模拟,这些方法中的任何一种都会在测试中引入片状感。

如果您发现由于要填充大量假数据而导致编写的模拟操作成本高昂,则可以将一些预填充的数据对象设置为常量,并在测试中使用它们或稍作修改的副本。如果此类数据对象具有外部依赖性,则可以通过分离两个方面的方式对其进行重构。


尝试测试Sharepoint似乎是唯一的方法,只有typemock可以让您模拟密封的类。


模拟在某种项目中很有用。但是,有时进行模拟非常耗时,并且投资回报率很低。


推荐阅读