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

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

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

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

我这样做

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

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

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

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

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

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

相关文章

适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题...
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结...
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容...