我知道如何使用这些术语,但我想知道是否有可接受的定义faking, mocking, and stubbing用于单元测试?您如何为您的测试定义这些?描述一下您可能会使用每种方法的情况。
以下是我如何使用它们:
Fake:实现接口但包含固定数据且不包含逻辑的类。根据实现简单地返回“好”或“坏”数据。
Mock:一个实现接口的类,允许动态设置从特定方法返回的值/抛出异常,并提供检查特定方法是否已被调用/未调用的能力。
Stub:与模拟类类似,但它不提供验证方法是否已被调用/未调用的能力。
每个的生成:
-
Mocks and Stubs可以手动生成或由模拟框架生成。
-
假课程是手工生成的。
按如下方式使用它们:
-
Mocks主要是为了验证我的类和依赖类之间的交互。
-
Stubs一旦我验证了交互并通过我的代码测试替代路径。
-
假课程主要是为了抽象出数据依赖性,或者当模拟/存根太繁琐而无法每次设置时。
您可以获得一些信息:
From 马丁·福勒 (Martin Fowler) 关于 Mock 和 Stub http://www.martinfowler.com/articles/mocksArentStubs.html
Fake对象实际上有工作实现,但通常采取一些捷径,这使得它们不适合生产
Stubs为测试期间拨打的电话提供预设答案,通常根本不响应测试编程之外的任何内容。存根还可以记录有关呼叫的信息,例如记住它“发送”的消息的电子邮件网关存根,或者可能只记录它“发送”的消息数量。
Mocks是我们在这里讨论的内容:预先编程的对象,形成了它们预期接收的调用的规范。
From xunit模式 http://xunitpatterns.com:
Fake:我们获取或构建一个非常轻量级的实现,其功能与 SUT 所依赖的组件提供的功能相同,并指示 SUT 使用它而不是真实的组件。
Stub:此实现配置为响应来自 SUT 的调用,其值(或异常)将在 SUT 内执行未经测试的代码(请参阅第 X 页的生产错误)。使用测试存根的一个关键指标是由于无法控制 SUT 的间接输入而导致代码未经测试
模拟对象它实现与 SUT(被测系统)所依赖的对象相同的接口。当我们需要进行行为验证时,我们可以使用模拟对象作为观察点,以避免由于无法观察在 SUT 上调用方法的副作用而导致出现未经测试的需求(请参阅第 X 页的生产错误)。
亲自
我尝试使用 Mock 和 Stub 来简化。当它是一个返回设置为测试类的值的对象时,我使用 Mock。我使用存根来模拟要测试的接口或抽象类。事实上,你怎么称呼它并不重要,它们都是不在生产中使用的类,而是用作测试的实用程序类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)