亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mockito 模擬 restTemplate 不使用返回模擬值

Mockito 模擬 restTemplate 不使用返回模擬值

MYYA 2023-03-31 09:59:20
相關代碼如下:服務代碼:@Overridepublic ResponseEntity<AppointmentResponse> createAppointment(AppointmentRequest partnerFulfillmentRequest) {    RestTemplate rt                                 = null;    ResponseEntity<AppointmentResponse> response    = null;    String uri                                      = null;    HttpEntity<AppointmentRequest> httpEntity       = null;    HttpHeaders headers = null;    try {            rt = new RestTemplate();            rt.getMessageConverters().add(new MappingJackson2HttpMessageConverter());            rt.getMessageConverters().add(new StringHttpMessageConverter());            uri = new String(internalServiceUrl+"/"+APP_NAME_INTERNAL+"/appointment");            log.info("Calling internal service URL : "+uri);            headers = new HttpHeaders();            headers.setContentType(MediaType.APPLICATION_JSON);            httpEntity = new HttpEntity<AppointmentRequest>(partnerFulfillmentRequest, headers);              response =  rt.exchange(uri, HttpMethod.PUT, httpEntity, AppointmentResponse.class);            if (response != null)            {                log.info("Got response from internal servicec-->statusCode: "+response.getStatusCodeValue());                log.info("Got response from internal service--> Body "+response.getBody());            }    }catch(HttpClientErrorException hceEx) {        //hceEx.printStackTrace();        AppointmentResponse res = new AppointmentResponse();        return new ResponseEntity<AppointmentResponse>(mapResponse(hceEx.getResponseBodyAsString()), hceEx.getResponseHeaders(), hceEx.getStatusCode());    }我得到 java.lang.AssertionError: Expected :500 Actual :200 并且可以理解,因為它實際上并沒有調用運行.thenReturn(responseEntity);邏輯。我的百萬美元問題是,為什么?它應該返回 responseEntity 值。我有 exchange() 到 any() 的所有參數,希望盡可能頻繁地觸發條件,因為我總是可以在不同的時間縮小條件。我沒有正確地嘲笑我的 restTemplate 嗎?這是我目前對發生的事情的懷疑。任何建議都會有所幫助!
查看完整描述

1 回答

?
蕪湖不蕪

TA貢獻1796條經驗 獲得超7個贊

您正在RestTemplate測試方法內部創建一個新實例。這意味著該exchange方法將從新實例調用,而不是模擬。如果包含該方法的類createAppointment具有RestTemplate.


你想要的是模擬新實例的構造函數RestTemplate,以便在創建新實例時將其替換。不幸的是,Mockito 無法模擬構造函數,因此您應該使用PowerMockito來模擬構造函數。


whenNew(RestTemplate.class).withNoArguments().thenReturn(restTemplate);


responseEntity = new ResponseEntity<>(

? ? ? ? ? ? "some response body",

? ? ? ? ? ? HttpStatus.OK

? ? );


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

? ? ? ? Mockito.<HttpMethod> any(),

? ? ? ? Mockito.<HttpEntity<?>> any(),

? ? ? ? Mockito.<Class<Object>> any()))

? ? ? ? .thenReturn(responseEntity);


查看完整回答
反對 回復 2023-03-31
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號