单方法包含两个Uri组件调用时如何Mock实现全测试覆盖
你当前测试无法覆盖getAssets()的核心原因有两个:
- 你对
restTemplate.exchange的两次打桩都返回了subtenant接口的响应,第二次调assets接口时拿到的还是subtenant的返回内容,要么解析assetId失败抛异常,要么直接中断流程走不到后续逻辑 - 你没有保证业务代码中的
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
相关产品推荐
相关产品推荐

