mocking - 你应该只模拟你拥有的类型吗?

标签 mocking

我通读了TDD: Only mock types you own Mark Needham 的条目,想知道这是否是最佳实践?

请注意,他并不反对 mock ,而是反对直接 mock - 他确实说编写包装器和 mock 是可以的。

最佳答案

我的回答是“不”。您应该模拟在给定单元测试的上下文中有意义的任何内容。您是否“拥有”模拟类型并不重要。

如今,在 Java 或 .NET 环境中,一切(我真的是指一切)都可以轻松模拟。因此,没有任何技术原因需要首先编写额外的包装器代码。

<小时/>

我最近(2010 年 11 月)一直在思考的一些其他想法,这些想法表明“仅模拟您拥有的类型”是多么不合逻辑:

  1. 假设您确实为第三方 API 创建了一个包装器,然后在单元测试中模拟了该包装器。然而,后来您发现包装器可以在另一个应用程序中重用,因此您将其移动到单独的库中。因此,现在包装器不再由您“拥有”(因为它在多个应用程序中使用,可能由不同的团队维护)。开发人员是否应该为旧包装创建一个新包装?!?并继续递归地执行,添加一层又一层本质上无用的代码?
  2. 假设其他人已经为一些重要的 API 创建了一个很好的包装器,并将其作为可重用的库提供。如果所述包装器正是我的特定用例所需要的,我是否应该首先为包装器创建一个包装器,具有几乎相同的 API,这样我就可以“拥有”它?!?

作为一个具体且现实的示例,请考虑 Apache Commons Email API,它只不过是标准 Java Mail API 的包装器。由于我不拥有它,因此每当我为需要发送电子邮件的类编写单元测试时,我是否应该始终为 Commons Email API 创建一个包装器?

关于mocking - 你应该只模拟你拥有的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1906344/

相关文章:

c# - 如何测试调用数据库的方法

c# - 来自微软的模拟框架?

ruby - 摩卡和嵌套对象

unit-testing - 在 Go 中模拟非接口(interface)类型

c# - 使用 Nsubstitute 进行模拟但出现错误

unit-testing - PHPUnit - Setter 不修改我的模拟

Python:使用用于单元测试的文件创建模拟或假目录

ios - 是否可以在静态方法中 OCMock 类调用?

angularjs - 使用 $provide 在 Jasmine 测试中重用 Angular 模拟

python - 模拟基类的方法