如何模拟外部服务改进单元测试?

时间:2009-02-17 22:51:32

标签: testing mocking

我正在连接一个简单的,如果是特殊的外部服务。

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

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

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

我转错了吗?如何消除这种明显的圆形度?

编辑我已根据司法部的有用评论澄清了我认为的问题。

3 个答案:

答案 0 :(得分:3)

让我先介绍一下my two answers at another question关于单元测试,以避免重复自己,首先。

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

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

但重点是要有一些你真正有信心并且完全掌控的东西。

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

确保您的类所依赖的任何东西都有一个接口(而不仅仅是一个具体的实现),然后您可以使用JMock。这将极大地简化您的测试。您可以执行诸如告诉它期望方法调用X,返回特定值或抛出异常等操作。这真的是一个节省时间。