TDD 如何处理模拟对象中的更改

2024-02-17

在编写单元测试时,对于单元与之交互的每个对象,我正在采取这些步骤(从我对 JBrains 的理解中窃取)集成测试是一个骗局 http://www.infoq.com/presentations/integration-tests-scam):

  1. 在单元中编写测试以确保它向协作对象发送正确的调用和参数
  2. 在单元中编写一个测试,确保它处理来自协作对象的所有可能的响应。这些响应都是模拟的,因此该单元是单独测试的。
  3. 在协作对象中编写测试以确保它接受调用和参数。
  4. 编写测试以确保发送回每个可能的响应。

当我决定重构一个在步骤 2 中模拟了响应的对象时,我的问题就出现了。如果我更改对象响应调用的方式,其他对象对该调用进行的任何测试都不会失败,因为它们都已被模拟以配合旧风格。如何使模拟与他们所模拟的对象保持同步?这有最佳实践吗?还是我完全误解了事情并且做错了?


我就是这样做的。

假设我必须更改接口方法的响应foo()。我收集了所有存根的协作测试foo()在列表中。我收集了方法的所有合同测试foo(),或者如果我没有合同测试,我会收集所有当前实现的所有测试foo()在列表中。

现在我创建一个版本控制分支,因为它会很混乱一段时间。

I @Ignore(JUnit 发言)或以其他方式禁用存根的协作测试foo()并开始一一重新实施和重新运行它们。我让他们全部通过。我可以在不接触任何生产实现的情况下做到这一点foo().

现在我重新实现实现的对象foo()与存根的新返回值相匹配的预期结果一一对应。请记住:协作测试中的存根对应于合同测试中的预期结果。

此时,所有协作测试现在都假设来自foo()合同测试/实施测试现在期望来自foo(),所以一切都应该正常。(TM)

现在整合你的分支并给自己倒点酒。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TDD 如何处理模拟对象中的更改 的相关文章

随机推荐