
What is Object Mocking and when do I need it?许多人在编写单元测试时都使用模拟对象。 什么是模拟对象? 为什么我需要一个? 我需要模拟对象框架吗?
对象模拟用于将依赖项排除在单元测试之外。 为此,通常需要对数据库有依赖性,但是通过对象模拟,您可以使用模拟框架模拟与数据库的交互,因此它可能会返回一个看起来像从数据库返回的数据集,然后可以进行测试您的代码,以确保它能够处理将数据集转换为人员对象的过程,而不是使用它来测试是否存在与数据库的连接。 已经有几个人回答了"什么",但是我想到了几个简单的"为什么": 性能
因为单元测试应该很快,所以测试一个组件 合作
如果您正在编写一个很好封装的 模拟对象使您可以对照正在编写的内容以及抽象细节(例如访问资源(磁盘,网络服务等))进行测试。然后,该模拟让您假装是该外部资源,类或其他内容。 您实际上并不需要模拟对象框架,只需扩展您不想在测试中担心的功能的类,并确保要测试的类可以使用模拟对象而不是真实对象(将其传递给通过构造函数或设置器之类的东西。 练习将显示模拟什么时候有用,什么时候没有帮助。 编辑:模拟资源尤为重要,因此您不必在测试过程中依赖它们的存在,并且可以模拟它们如何存在以及它们如何响应的详细信息(例如模拟FileNotFoundException或缺少的Web服务) ,或Web服务的各种可能的返回值)...都没有涉及到缓慢的访问时间(模拟将比在测试中访问此类资源要快得多)。
当然不是。有时候,手工编写模拟游戏可能会非常乏味。但是对于简单的事情,这一点也不坏。将"最后负责时刻"的原理应用于模拟框架,只有在向自己证明手写模拟比其价值更大的麻烦时,才应从手写模拟转换为框架。 如果您只是从模拟开始,那么直接跳入框架至少会使您的学习曲线翻倍(可以翻倍曲线吗?)。当您花了一些项目手工编写模拟时,模拟框架将变得更加有意义。 对象模拟是从接口,抽象类或带有虚拟方法的类中创建"虚拟"或模拟对象的方法。它允许您将其中一种包装在自己的定义中以进行测试。这对于制作要测试的特定代码块所依赖的对象很有用。 我喜欢使用的一种流行的叫做Moq,但是还有很多诸如RhinoMock之类的东西,还有许多我不知道的东西。 它使您能够测试项目的一部分如何与其余部分交互,而无需构建整个项目并可能丢失重要部分。 编辑:维基百科的一个很好的例子:它允许您事先测试代码,就像汽车设计师使用碰撞测试假人来测试事故期间汽车的行为。 另一个用途是,它将使您可以对系统中尚未构建的其他部分进行测试。例如,如果您的类依赖于其他类,而该类是其他人正在使用的功能的一部分,则您可以只要求一个几乎完整的接口,对该接口进行编程,并按自己的期望对细节进行模拟。然后,确保您对接口的假设是正确的(无论是在开发过程中,还是在功能完成后)。 模拟框架是否有用,部分取决于编写代码的语言。使用静态语言时,您需要付出更多的努力才能使编译器欺骗您的模拟对象,以代替真实对象。在动态类型的语言(如Python,Ruby或Javascript)中,通常可以将方法附加到任意对象或类上,然后将其作为参数传递-这样,框架的价值将大大减少。 用于.net单元测试的2个推荐的模拟框架是Typemock Isolator和Rhino Mock。 在以下链接中,您可以看到Typemock的解释,说明为什么需要用于单元测试的模拟框架。 |