【问题标题】:How can mocking external services improve unit tests?模拟外部服务如何改进单元测试?
【发布时间】:2009-02-17 22:51:32
【问题描述】:

我正在连接到一个简单但特殊的外部服务。

我相信我的单元测试不应该依赖于该外部服务的可用性或实现,所以我打算模拟它。

我需要模拟来接受和返回真实的消息和响应 - 否则我的测试将无法代表真实的事态。例如,它必须抛出正确类型的错误——它至少有 7 种不同的方式会失败(在你我之间,它不是一个设计良好的外部服务)。因此,至少我必须有一个消息/响应对的哈希值。

因此,嘲笑并没有减少偶然性,而是在其他地方重新引入了它。事实上,正如俗话所说,现在我有两个问题:我必须确保我的哈希中的内容是外部服务行为方式的公平表示。但可以肯定的是,响应对象 X 提供给消息 m 的规范来源是 X 本身。其他任何事情都是有风险和混乱的。

我走错了吗?如何消除这种明显的循环?

编辑我已经澄清了我认为的问题是在正义的帮助 cmets 的光。

【问题讨论】:

    标签: testing mocking


    【解决方案1】:

    首先,为了避免重复自己,让我向您推荐 my two answers at another question 关于单元测试的信息。

    我认为在这种环境中模拟给你的东西是它严格指定认为该外部接口的行为将是什么。这意味着你有一个受控的测试(有些东西告诉我这个外部服务经常改变。)所以,你不仅可以使用已知的“良好”响应序列来测试和调试你的代码,而且你有一个记录在案的集合您所期望的示例。

    如果我处于这种情况,并且取决于实际服务,我会很想为外部服务编写单元测试或模拟。这样,如果您在实际操作中发现错误,您可以 (1) 使用外部接口的 mock 对您的代码运行测试,以及 (2) 根据您的期望测试外部服务。

    不过,关键是要有一些你真正有信心并且完全可以控制的东西。

    【讨论】:

    • 啊,是的,就是这样,谢谢。风险和维护不会消失,因为它是一个外部服务!但是通过表达我对它的行为的期望,我隔离了不确定性。
    • “我在另一个问题上的两个答案”的链接已损坏。谁能找到它现在住的地方?
    • 它是房主协会的受害者“这个八年前的帖子与我们现在认为的好问题不匹配”删除。
    • Archive link 对于那些路过的人。查理马丁的第一个答案(格式略有偏差)。
    【解决方案2】:

    用于单元测试的模拟应该准确地代表外部服务。您应该为模拟的外部服务选择预定义的输入和输出值集。它们可能是也可能不是外部服务实际返回的内容(但它们应该是“某种”真实的)。单元测试的目的是在给定这组输入和输出的情况下,仔细检查对象的行为是否正确,以了解“正确”的特定含义。

    【讨论】:

    • 谢谢 - 我已经根据您的澄清 cmets 编辑了 qu。我不确定你是否回答了我潜在的担忧。如果你有时间,你能再看看吗?干杯。
    【解决方案3】:

    确保你的类所依赖的任何东西都有一个接口(而不仅仅是一个具体的实现),然后你就可以使用JMock。这将极大地简化您的测试。你可以做一些事情,比如告诉它期待一个方法调用 X,返回一个特定的值,或者抛出一个异常。真的很省时。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 2015-11-29
      • 2016-03-06
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多