带大小校验重试的copieFichierAvecRetry递归函数JUnit测试方案
递归重试文件复制方法的单元测试设计方案
因为生产环境下真实的文件复制操作第一次就会顺利完成,生成的目标文件大小一定和源文件匹配,天然触发不了重试分支,所以完全不需要依赖真实文件系统的正常行为,通过可控的模拟手段人为制造大小不匹配的场景,就能完整覆盖所有递归逻辑分支。
核心实现思路
不要直接调用真实的文件复制、大小校验原生实现,把方法涉及的外部交互通过测试桩做自定义控制,刻意设置“大小不匹配”的触发条件,引导测试流程走到预设的递归分支,验证逻辑的正确性。这种方式不需要改动原有业务代码,测试过程完全可控,不会因为测试环境的文件系统差异出现偶现失败。
具体落地方法
- 基于Mockito的快速打桩方案(开发量最低)
- 对方法依赖的三个核心交互点做打桩:
FileObject.copyFrom()、FileObject.delete()、verificationTailleCorrespondantes() - 给大小校验方法配置连续返回值:前N次调用返回
false(模拟大小不匹配的异常场景),第N+1次调用返回true(模拟最终复制成功的结果) - 测试执行完成后,通过Mockito的验证API检查:重试过程中是否按预期调用了目标文件的删除方法清理异常文件,递归触发的次数是否和预设的最大重试值匹配
- 对方法依赖的三个核心交互点做打桩:
- 自定义测试代理的无mock方案
- 编写一个继承自真实
FileObject的测试代理类,覆写copyFrom方法的行为:前N次复制时只写入源文件一半的内容,保证校验大小时一定不匹配;第N+1次复制时完整写入所有内容,保证大小和源文件一致 - 传入和模拟失败次数匹配的重试阈值,比如模拟前2次复制失败就把
nbRetry设为2,初始currentNbRetry传0,就能完整跑通整个递归重试链路,不需要额外引入mock框架
- 编写一个继承自真实
必须覆盖的边界测试场景
- 一次成功场景:打桩大小校验第一次调用就返回
true,验证方法不会进入递归分支,返回值为预期的true - 多次重试最终成功场景:前2次校验返回
false,第3次返回true,验证每次大小不匹配后都会先删除异常目标文件,再发起下一次递归复制 - 超最大重试次数失败场景:不管重试多少次,大小校验永远返回
false,验证方法最终返回false,且重试次数严格不超过设定的nbRetry阈值,不会出现无限递归 - 校验异常场景:打桩
verificationTailleCorrespondantes()抛出IOException,验证方法会正确捕获异常、将tailleOk置为false,不会直接抛出异常中断测试流程
注意:当前的递归实现存在一个逻辑漏洞——递归调用自身时没有将返回值赋值给外层的
tailleOk变量,哪怕后续重试中大小校验通过了,最外层方法也会返回第一次校验时的false结果。编写测试用例时这个问题会直接暴露,只需要将递归调用的结果赋值给tailleOk即可修复,把原来的递归调用行:copieFichierAvecRetry(copieFichierFile, fichierACopier, nbRetry, currentNbRetry);修改为:
tailleOk = copieFichierAvecRetry(copieFichierFile, fichierACopier, nbRetry, currentNbRetry);
内容的提问来源于stack exchange,提问作者Cesar
相关产品推荐
相关产品推荐

