You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单方法包含两个Uri组件调用时如何Mock实现全测试覆盖

你当前测试无法覆盖getAssets()的核心原因有两个:

  1. 你对restTemplate.exchange的两次打桩都返回了subtenant接口的响应,第二次调assets接口时拿到的还是subtenant的返回内容,要么解析assetId失败抛异常,要么直接中断流程走不到后续逻辑
  2. 你没有保证业务代码中的subtenantInfoMap能正确拿到测试用的subtenantName(NSTI)对应的值,很可能走到subtenant不存在的异常分支,提前终止了方法执行

具体修复步骤

  • 第一步:配置restTemplate的连续返回值
    业务代码会先后两次调用restTemplate.exchange,分别对应subtenant和assets接口,你可以用Mockito的连续返回语法给两次调用配置不同的响应:
when(restTemplate.exchange(ArgumentMatchers.anyString(), ArgumentMatchers.any(HttpMethod.class), ArgumentMatchers.any(HttpEntity.class), 
        ArgumentMatchers.<Class<String>>any()))
.thenReturn(
    // 第一次调用(subtenant接口)返回subtenant数据
    new ResponseEntity<String>(entityDtoCreaters.getSubtenant(),HttpStatus.OK),
    // 第二次调用(assets接口)返回assets数据
    new ResponseEntity<String>(entityDtoCreaters.getAssets(),HttpStatus.OK)
);
  • 第二步:确保接口响应符合预期
    你需要保证entityDtoCreaters.getSubtenant()返回的响应内容中包含测试用的subtenantName(NSTI)的对应条目,这样checkForMultiplePagesSubtenants执行后,业务侧的subtenantInfoMap才能成功取到subtenantId,进入后续的assets接口调用逻辑。同时你要新增entityDtoCreaters.getAssets()方法,返回符合业务解析规则的assets接口响应,保证getAssetId能解析出非空的assetId。

  • 第三步:补全缺失的依赖打桩
    你当前注释了getTenantNameForMapDTO相关的打桩,如果这个方法有外部依赖,要补充对应的打桩逻辑,避免执行到该步时抛出异常中断流程。如果addStationsMappingforNewMap方法有外部调用,也要补充对应打桩。

  • 第四步:补充异常分支测试实现全量覆盖
    要覆盖全部代码,还要单独写测试用例覆盖以下分支:

    • 地图名称已存在分支:打桩mapRepository.existsMapWithMapName返回true,验证抛出BadRequestException
    • subtenant不存在分支:返回的subtenant响应中不包含NSTI对应的条目,验证抛出SUBTENANT_DOESNT_EXIST异常
    • assetId为空分支:第二次restTemplate.exchange返回的assets响应无法解析出有效assetId,验证抛出ASSET_ID_DOESNT_EXIST异常

内容的提问来源于stack exchange,提问作者Shivani Shankar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:45:03