微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 ArgumentMatchers 处理 RestTeamplate 无法解决问题

如何解决使用 ArgumentMatchers 处理 RestTeamplate 无法解决问题

我有一段代码可以调用外部 api,我想编写测试用例来覆盖相同的内容

HttpHeaders headers = new HttpHeaders();
        headers.set(REQ_ACCEPT,MediaType.APPLICATION_JSON.toString());
        headers.set(UUID,pojo.getUuid());
        headers.set(CHANNEL_ID,APIN_CHANNEL_ID);
        headers.set(BUSInesS_CODE,APIN_BUSInesS_CODE);
        headers.set(COUNTRYCODE,CountryCode.valueOf(pojo.getCountry().toupperCase()).getCode());
        headers.set(MESSAGE_ID,APIN_MESSAGE_ID);
        headers.set(VERSION_NO,APIN_VERSION_NO);
        headers.set(CLIENT_SECRET,clientSecret);
        headers.set(CLIENT_ID,clientId);
        headers.setContentType(MediaType.APPLICATION_JSON);
        httpentity<String> request = new httpentity<>(solaceResponse,headers);
        logger.info("getInternalApimRespose uri-{}",url);

        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url,request,String.class);

        externalResponse = responseEntity.getBody();

上面的junit是..

String string = "result";
    Mockito.when(mockRestTemplate.postForEntity(ArgumentMatchers.anyString(),ArgumentMatchers.<httpentity<String>>any(),ArgumentMatchers.<Class<String>>any()))
            .thenReturn(generateResponseEntityObject(string,HttpStatus.OK));

private ResponseEntity<String> generateResponseEntityObject(String response,HttpStatus httpStatus){
    return new ResponseEntity<>(response,httpStatus);
}

我尝试了参数匹配器和 mockito.any 语句的所有不同组合,但它们似乎都不起作用..

我在下面遇到异常..

    org.mockito.exceptions.misusing.PotentialStubbingProblem: 
Strict stubbing argument mismatch. Please check:
 - this invocation of 'postForEntity' method:
    mockRestTemplate.postForEntity(
    null,<{"requestBody":{"reqDateTime":null,"reqCardNumber":"5467182634567658","reqPinEncryptionType":null,"reqEncryptedPin":null}},[reqAccept:"application/json",uuid:"null",channelId:"GRC",businessCode:"ICG",countryCode:"EU",messageId:"0401",versionNo:"01",clientSecret:"null",clientId:"null",Content-Type:"application/json"]>,class java.lang.String
);
    -> at com.citi.tts.grace.apin.connector.service.ApinConnectorClient.getInternalApimResponse(ApinConnectorClient.java:96)
 - has following stubbing(s) with different arguments:
    1. mockRestTemplate.postForEntity(
    "",null,null
);
      -> at com.citi.tts.grace.apin.conector.service.ApinConnetorClientTest.testGetInternalApimResponse(ApinConnetorClientTest.java:68)
Typically,stubbing argument mismatch indicates user mistake when writing tests.
Mockito fails early so that you can debug potential problem easily.
However,there are legit scenarios when this exception generates false negative signal:
  - stubbing the same method multiple times using 'given().will()' or 'when().then()' API
    Please use 'will().given()' or 'doReturn().when()' API for stubbing.
  - stubbed method is intentionally invoked with different arguments by code under test
    Please use default or 'silent' JUnit Rule (equivalent of Strictness.LENIENT).
For more information see javadoc for PotentialStubbingProblem class.
    at com.citi.tts.grace.apin.connector.service.ApinConnectorClient.getInternalApimResponse(ApinConnectorClient.java:96)
    at com.citi.tts.grace.apin.conector.service.ApinConnetorClientTest.testGetInternalApimResponse(ApinConnetorClientTest.java:70)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:686)
    at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131)
    at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140)
    at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84)
    at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45)
    at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104)
    at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98)
    at 

我参考了这些页面..

  1. Mockito mocking restTemplate.postForEntity
  2. How to Mock Rest template using mockito

编辑:我也尝试使用宽松的嘲笑来避免这种情况,但是 该存根方法的返回类型始终返回 null

Mockito.lenient().when(mockRestTemplate.postForEntity(ArgumentMatchers.any(String.class),ArgumentMatchers.any(),ArgumentMatchers.eq(String.class)))
            .thenReturn(generateResponseEntityObject(result,HttpStatus.OK));

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。