You need to enable JavaScript to run this app. 带大小校验重试的copieFichierAvecRetry递归函数JUnit测试方案
优惠活动
大模型
产品
解决方案
定价
更多

带大小校验重试的copieFichierAvecRetry递归函数JUnit测试方案

递归重试文件复制方法的单元测试设计方案

因为生产环境下真实的文件复制操作第一次就会顺利完成,生成的目标文件大小一定和源文件匹配,天然触发不了重试分支,所以完全不需要依赖真实文件系统的正常行为,通过可控的模拟手段人为制造大小不匹配的场景,就能完整覆盖所有递归逻辑分支。

核心实现思路

不要直接调用真实的文件复制、大小校验原生实现,把方法涉及的外部交互通过测试桩做自定义控制,刻意设置“大小不匹配”的触发条件,引导测试流程走到预设的递归分支,验证逻辑的正确性。这种方式不需要改动原有业务代码,测试过程完全可控,不会因为测试环境的文件系统差异出现偶现失败。

具体落地方法

  • 基于Mockito的快速打桩方案(开发量最低)
    1. 对方法依赖的三个核心交互点做打桩:FileObject.copyFrom()、FileObject.delete()、verificationTailleCorrespondantes()
    2. 给大小校验方法配置连续返回值:前N次调用返回false(模拟大小不匹配的异常场景),第N+1次调用返回true(模拟最终复制成功的结果)
    3. 测试执行完成后,通过Mockito的验证API检查:重试过程中是否按预期调用了目标文件的删除方法清理异常文件,递归触发的次数是否和预设的最大重试值匹配
  • 自定义测试代理的无mock方案
    1. 编写一个继承自真实FileObject的测试代理类,覆写copyFrom方法的行为:前N次复制时只写入源文件一半的内容,保证校验大小时一定不匹配;第N+1次复制时完整写入所有内容,保证大小和源文件一致
    2. 传入和模拟失败次数匹配的重试阈值,比如模拟前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.11 02:45:00