Testing 什么是对象模拟?我什么时候需要它?

Testing 什么是对象模拟?我什么时候需要它?,testing,mocking,Testing,Mocking,许多人在编写单元测试时使用模拟对象。什么是模拟对象?为什么我需要一个?我需要一个模拟对象框架吗?它允许您测试项目的一部分如何与其余部分交互,而无需构建整个项目,也不会遗漏重要部分 编辑:来自维基百科的一个很好的例子:它允许你事先测试代码,就像汽车设计师使用碰撞测试假人来测试汽车在事故中的行为。它允许你测试项目的一部分如何与其他部分交互,而不必构建整个项目,也不可能遗漏重要部分 编辑:wikipedia中的一个很好的例子:它允许你事先测试代码,就像汽车设计师使用碰撞测试假人来测试汽车在事故中的行为

许多人在编写单元测试时使用模拟对象。什么是模拟对象?为什么我需要一个?我需要一个模拟对象框架吗?

它允许您测试项目的一部分如何与其余部分交互,而无需构建整个项目,也不会遗漏重要部分


编辑:来自维基百科的一个很好的例子:它允许你事先测试代码,就像汽车设计师使用碰撞测试假人来测试汽车在事故中的行为。

它允许你测试项目的一部分如何与其他部分交互,而不必构建整个项目,也不可能遗漏重要部分


编辑:wikipedia中的一个很好的例子:它允许你事先测试代码,就像汽车设计师使用碰撞测试假人来测试汽车在事故中的行为一样。

对象模拟是一种从接口、抽象类或具有虚拟方法的类创建“虚拟”或模拟对象的方法。它允许您在自己的定义中对其中一个进行封装,以用于测试目的。它有助于生成一个对象,该对象是您正在测试的特定代码块所依赖的


我喜欢使用的一种流行方法是调用RhinoMock,但还有许多其他类似RhinoMock的方法,还有许多我不知道的方法。

对象模拟是从接口、抽象类或具有虚拟方法的类创建“虚拟”或模拟对象的一种方法。它允许您在自己的定义中对其中一个进行封装,以用于测试目的。它有助于生成一个对象,该对象是您正在测试的特定代码块所依赖的


我喜欢使用的一个流行的对象叫做RhinoMock,但是还有很多其他的类似RhinoMock的对象,还有很多我不知道的对象。

一个模拟对象可以让您测试您正在编写的内容,以及抽象的细节,例如访问资源(磁盘、网络服务等)。然后,mock允许您假装是该外部资源或类或其他任何东西

您不需要真正的模拟对象框架,只需扩展您不想在测试中担心的功能类,并确保您正在测试的类可以使用您的模拟而不是真实的对象(通过构造函数或setter或其他方式传递它)

练习将显示模拟何时有用,何时没有


编辑:模拟资源特别重要,因此您不必依赖它们在测试期间存在,您可以模拟它们如何存在以及它们响应的详细信息(例如模拟FileNotFoundException,或缺少的Web服务,或Web服务的各种可能返回值)…所有这些都没有涉及到缓慢的访问时间(模拟将证明比在测试中访问此类资源快得多)。

模拟对象允许您测试您正在编写的内容,以及抽象细节,例如访问资源(磁盘、网络服务等)。然后,mock允许您假装是该外部资源或类或任何东西

您不需要真正的模拟对象框架,只需扩展您不想在测试中担心的功能类,并确保您正在测试的类可以使用您的模拟而不是真实的对象(通过构造函数或setter或其他方式传递它)

练习将显示模拟何时有用,何时没有


编辑:模拟资源特别重要,因此您不必依赖它们在测试期间存在,您可以模拟它们如何存在以及它们响应的详细信息(例如模拟FileNotFoundException,或缺少的Web服务,或Web服务的各种可能返回值)…所有这些都没有涉及缓慢的访问时间(模拟将证明比在测试中访问此类资源快得多)。

对象模拟用于将依赖项排除在单元测试之外。 有时您会有一个类似“SelectPerson”的测试,它将从数据库中选择一个人并返回一个person对象


要做到这一点,您通常需要依赖数据库,但是通过对象模拟,您可以使用模拟框架模拟与数据库的交互,因此它可能会返回一个看起来像从数据库返回的数据集,然后您可以测试您的代码,以确保它能够处理将数据集转换为person对象的过程a而不是使用它来测试与数据库的连接是否存在。

对象模拟用于将依赖项排除在单元测试之外。 有时您会有一个类似“SelectPerson”的测试,它将从数据库中选择一个人并返回一个person对象


要做到这一点,您通常需要依赖数据库,但是通过对象模拟,您可以使用模拟框架模拟与数据库的交互,因此它可能会返回一个看起来像从数据库返回的数据集,然后您可以测试您的代码,以确保它能够处理将数据集转换为person对象的过程a而不是用它来测试与数据库的连接是否存在。

另一个用途是,它可以让您针对尚未构建的系统的其他部分进行测试。例如,如果您的类依赖于某个其他类,而该类是其他人正在使用的功能的一部分,则您可以要求提供一个基本完整的接口,即到数据库的程序然后,确保你对界面的假设是正确的(无论是在开发过程中,还是在功能完成后).

另一个用途是,它可以让您针对尚未构建的系统的其他部分进行测试。例如,如果您的类依赖于某个其他类,而该类是其他人正在使用的功能的一部分,则您可以要求提供一个基本完整的接口,对该接口进行编程,并按照预期的方式模拟细节。Th嗯,请确保您对接口的假设是正确的(无论是在开发时,还是在onc时)