使用Mockito模拟RestTemplate.exchange

kqqjbcuj  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(246)

这是我的代码,我想嘲笑。

Map<String, String> params = new HashMap<>();
    params.put(LOGIN_ID, loginId);
    params.put(LOGIN_PWD, loginPwd);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON);
    HttpEntity httpEntity = new HttpEntity<>(params, headers);
    ResponseEntity<HashMap> omsResponse = restTemplate.exchange(loginUrl, HttpMethod.POST, httpEntity, HashMap.class);

这是我正在运行的测试。

PromotionDto promotionDto = getPromotionDto();
    ResponseEntity<HashMap> omsResponse = new ResponseEntity<>(new HashMap(), HttpStatus.OK);
    Map<String, String> params = new HashMap<>();
    HttpHeaders headers = new HttpHeaders();
    HttpEntity httpEntity = new HttpEntity<>(params, headers);
    String loginUrl = "https://dev.example.com/smcfs/restapi/invoke/login";
    Mockito.when(restTemplate.exchange(loginUrl, HttpMethod.POST, httpEntity, HashMap.class)).thenReturn(omsResponse);
    OrderCaptureOMSResponse response = omsService.orderCapture(promotionDto, IS_EMPLOYEE);

我遇到的错误

org.mockito.exceptions.misusing.PotentialStubbingProblem:

严格存根参数不匹配。请检查:

  • “Exchange”方法调用:restTemplate.exchange空,POST,〈{登录ID =空,密码=空},[内容类型:“应用程序/json”]〉,类java.util.哈希Map);- 〉在com上。qurateretail。订单。促销。服务。系统服务实现。系统界面登录(系统服务实现。java:87)

1.包含以下具有不同参数的存根:
1.在restTemplate.exchangehttps://dev.example.com/smcfs/restapi/invoke/login列Map。一般来说,存根参数不匹配表示用户在编写代码时出错。

ee7vknir

ee7vknir1#

当复制你的代码并自己运行它时,如果使用正确,它工作得很好;).

ResponseEntity<HashMap> omsResponse = new ResponseEntity<>(new HashMap(), 
HttpStatus.OK);
Map<String, String> params = new HashMap<>();
HttpHeaders headers = new HttpHeaders();
HttpEntity httpEntity = new HttpEntity<>(params, headers);
String loginUrl = "https://dev.example.com/smcfs/restapi/invoke/login";
Mockito.when(restTemplate.exchange(loginUrl, HttpMethod.POST, httpEntity, HashMap.class)).thenReturn(omsResponse);

ResponseEntity<HashMap> exchange = restTemplate.exchange(loginUrl, HttpMethod.POST, httpEntity, HashMap.class);
System.out.println(exchange);

从错误消息

his invocation of 'exchange' method: restTemplate.exchange( null, POST, 
<{LoginID=null, Password=null},[Content-Type:"application/json"]>, class 
java.util.HashMap );

你可以看到在你的代码中,参数“loginUrl”和你所模拟的是不同的。在你的模拟中,它模拟“https://dev.example.com/smcfs/restapi/invoke/login“作为loginUrl。在你的实际执行中,代码中的URL为空。只有当模拟和该方法的调用具有完全相同的参数时,模拟才起作用。为什么你的loginUrl为空,这是我不能用你提供的代码说出来的。相关部分缺失。
另一种方法是对模拟进行归纳。

Mockito.when(restTemplate.exchange(any(), ...

然而,这是一个有点棘手的restTemplate,因为方法重载的“交换”使它变得困难。匹配参数是更好的反正。

相关问题