1

模拟框架是否仅支持编写单元测试,或者是否存在开发人员会使用它们的其他情况?

在测试区域之外是否存在它们有用的情况?

4

2 回答 2

1

如果您需要在测试环境之外扩展/更改类行为,您将扩展/修改/子类化有问题的类。

模拟发生在源代码中,就像子类化一样,所以没有任何好处。模拟不会在运行时环境之外持续存在,因此它们不是可部署的工件。模拟不包括明确定义之外的行为。

在测试之外它们可能有合法用途,但我很难找到 AOP 不能更好地服务的一个。

于 2013-04-28T11:21:57.190 回答
1

模拟对象的全部意义在于它们“不是真实的”对象。至少在它们“不是生产”对象的意义上“不是真实的”。根据定义,这几乎是对您的问题的简短回答:不。

但是,话虽如此:您可以很容易地发现自己使用了一个模拟对象,后来发现该对象在生产代码中具有功能用途。

一个简单的例子是,如果你编写了一个模拟对象来实现一个特定的接口,但所有实现该接口的方法什么都不做。这也称为空实现对象。
Null 实现对象在生产代码中确实有一个有用的目的,您有一天可能会决定在生产代码中使用该实现。尽管这样做时,您不应再将该对象视为模拟对象。您将在生产代码中定义 null 实现对象,并将您的测试用例更改为使用 null 实现对象。

举一个实际的例子:

  • 如果您的某些被测代码调用记录器,您通常不希望您的测试用例首先设置一个临时日志文件,该文件也必须被删除。
  • 因此,您的测试用例可能会定义一个作为 null 实现对象的模拟记录器,并确保测试框架中的记录改为使用它。
  • 稍后您可能会决定向您的应用程序添加一项功能以禁用日志记录。
  • 您不想在if assigned(Logger) then Logger.write(...)每次调用记录器时都写入。
  • 因此,Logger每当禁用日志记录时,您的应用程序将设置为 null 实现对象。
于 2013-04-28T19:25:18.143 回答