TDD视角下无需新增测试,如何为Mockito.verify传入正确参数?
问题解答
1. 无需新增/参数化测试,传递Body参数到someObject.call的TDD步骤
严格TDD要求每一步都保持测试通过,你可以按以下小步调整:
- 第一步:给
handle方法添加Body参数,但保留硬编码调用
修改Service的handle方法,让它接收Body参数,但内部依然用原来的硬编码值调用someObject.call。比如:
同时修改现有测试,调用// 修改后代码 public void handle(Body body) { someObject.call("hardcoded_value"); // 还是硬编码 }handle时传入一个构造好的Body实例(其目标字段值设为原硬编码值),测试依然会通过——因为someObject.call的参数没变,验证逻辑也没改。 - 第二步:把硬编码参数替换为Body中的对应值
直接把someObject.call的参数换成Body里的目标字段,比如:
这时候测试依然通过——因为测试用的Body的// 修改后代码 public void handle(Body body) { someObject.call(body.getTargetParam()); }targetParam就是原硬编码值,验证逻辑还是检查这个值,整个交互行为和之前完全一致。
整个过程没有新增测试,也不需要参数化,每一步都保持测试绿灯,符合严格TDD的小步推进要求。
2. 这类修改是否属于重构步骤?
严格来说,属于重构步骤。
重构的核心定义是:在不改变软件外部可观测行为的前提下,优化内部代码结构。你当前的修改只是把硬编码的参数来源从代码内移到了输入的Body中,但只要测试验证的交互逻辑(调用someObject.call的参数值)没有变化,软件的外部行为就和之前完全一致——输入特定Body时,输出的交互和硬编码版本完全相同。这种“替换参数来源但保持行为一致”的调整,完全符合重构的范畴,因为前后测试都能通过,说明外部行为没有被改变。
内容的提问来源于stack exchange,提问作者vashykator
相关产品推荐
相关产品推荐

