在编写单元测试时,对于单元与之交互的每个对象,我正在采取这些步骤(从我对 JBrains 的理解中窃取)集成测试是一个骗局 http://www.infoq.com/presentations/integration-tests-scam):
- 在单元中编写测试以确保它向协作对象发送正确的调用和参数
- 在单元中编写一个测试,确保它处理来自协作对象的所有可能的响应。这些响应都是模拟的,因此该单元是单独测试的。
- 在协作对象中编写测试以确保它接受调用和参数。
- 编写测试以确保发送回每个可能的响应。
当我决定重构一个在步骤 2 中模拟了响应的对象时,我的问题就出现了。如果我更改对象响应调用的方式,其他对象对该调用进行的任何测试都不会失败,因为它们都已被模拟以配合旧风格。如何使模拟与他们所模拟的对象保持同步?这有最佳实践吗?还是我完全误解了事情并且做错了?
我就是这样做的。
假设我必须更改接口方法的响应foo()
。我收集了所有存根的协作测试foo()
在列表中。我收集了方法的所有合同测试foo()
,或者如果我没有合同测试,我会收集所有当前实现的所有测试foo()
在列表中。
现在我创建一个版本控制分支,因为它会很混乱一段时间。
I @Ignore
(JUnit 发言)或以其他方式禁用存根的协作测试foo()
并开始一一重新实施和重新运行它们。我让他们全部通过。我可以在不接触任何生产实现的情况下做到这一点foo()
.
现在我重新实现实现的对象foo()
与存根的新返回值相匹配的预期结果一一对应。请记住:协作测试中的存根对应于合同测试中的预期结果。
此时,所有协作测试现在都假设来自foo()
合同测试/实施测试现在期望来自foo()
,所以一切都应该正常。(TM)
现在整合你的分支并给自己倒点酒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)