单元测试 – TDD如何处理嘲笑对象的变化

在单元测试中,对于单元交互的每个对象,我正在采取这些步骤(从我对JBrains的 Integration Tests are a Scam的理解中窃取):

>在本机中编写一个测试,以确保它向协作对象发送正确的调用和参数
>在单元中编写一个测试,确保它处理来自协作对象的所有可能的响应.这些响应都是嘲笑的,因此该单元被隔离测试.
>在协作对象中写一个测试,以确保它接受调用和参数.
>写测试以确保每个可能的响应都被发回.

当我决定重构在第2步中嘲笑的对象时,我的问题来了.如果我改变对象响应一个调用的方式,其他对象对该调用的测试都不会失败,因为它们都被嘲笑匹配旧风格.你如何保持嘲讽与他们嘲笑的对象最新?这是最好的做法吗?还是我完全误解了事情,做错了?

我这样做

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

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

我@Ignore(JUnit说话)或以其他方式禁用stub foo()的协作测试,并开始重新实现并重新运行它们.我让他们过去了我可以这样做,而不用触摸任何生产实现的foo().

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

在这一点上,所有协作测试现在都假设来自foo()的新响应,合同测试/实现测试现在期待来自foo()的新响应,所以It Should All Just.

现在整合你的分支,倒一些酒.

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...