使用模拟框架进行其他事情然后进行单元测试?

时间:2013-04-28 11:07:43

标签: unit-testing testing mocking

模拟框架是否只支持编写单元测试,还是有开发人员使用它们的其他情况?

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

2 个答案:

答案 0 :(得分:1)

如果您需要在测试环境之外扩展/更改类行为,则可以扩展/修改/子类化相关类。

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

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

答案 1 :(得分:1)

模拟对象的重点是它们“不是真正的”对象。至少“不真实”在某种意义上它们是“不是生产”的对象。这几乎就是定义,对你的问题做出简短回答:不。

然而,那说:你可以很容易地找到一个模拟对象,你后来发现它在生产代码中具有功能目的。

一个简单的例子是,如果你编写了一个模拟对象来实现一个特定的接口,但实现该接口的所有方法都不做任何事情。这也称为 null实现对象 空的实现对象确实在生产代码中起到了有用的作用,有一天你可能决定在生产代码中使用该实现。虽然在执行此操作时,您不应再将该对象视为模拟对象。您可以在生产代码中定义null实现对象,并将测试用例更改为使用null实现对象。

一个实际例子:

  • 如果您测试的某些代码调用了一个记录器,您通常不希望您的测试用例首先设置一个临时日志文件,而该文件也必须删除。
  • 因此,您的测试用例可能会定义一个模拟记录器,它是一个null实现对象,并确保测试框架内的日志记录使用它。
  • 稍后您可能决定向应用程序添加一项功能以禁用日志记录。
  • 每次调用记录器时,您都不想写if assigned(Logger) then Logger.write(...)
  • 因此,只要禁用日志记录,您的应用程序就会将Logger设置为空实现对象。