我試圖了解泛型在 Mockito 的情況下是如何作業的。
我正在嘗試模擬RestTemplate,但是以下代碼無法編譯,我不知道為什么:
var expectedResponse = createServiceResponse();
when(restTemplate.exchange(anyString(), any(HttpMethod.class),
Mockito.<HttpEntity<Object>>any(),
Mockito.<ServiceResponse>any().getClass(), anyMap()))
.thenReturn(ResponseEntity.ok(expectedResponse));
編譯器不斷給我錯誤資訊:
Cannot resolve method 'thenReturn(org.springframework.http.ResponseEntity<T>)
但是當我切換Mockito.<ServiceResponse>any().getClass()時Mockito.<Class<ServiceResponse>>any()編譯成功。
為什么會這樣?
Mockito.<ServiceResponse>any().getClass()和 和有Mockito.<Class<ServiceResponse>>any()什么區別?
他們應該是一回事吧?
我的意思是類ServiceResponse應該是Class<ServiceResponse>. 對 ?
我沒有很好地掌握高級泛型,所以我無法理解編譯器在做什么。
請在答案中添加一些描述,以便我能夠理解為什么它會按照預期的方式作業。
uj5u.com熱心網友回復:
是有什么區別Mockito.<ServiceResponse>any().getClass()和Mockito.<Class<ServiceResponse>>any()?
Mockito.<ServiceResponse>any()是 的一個實體ServiceResponse。并getClass()從任何實體呼叫return Class<?>。getClass()創建以獲取實體的實際類,通常用于運行時比較。
另一方面,
Mockito.<Class<ServiceResponse>>any()是一個實體Class<ServiceResponse>
我的意思是 ServiceResponse 的類應該是 Class。對 ?
不是真的,請考慮以下代碼
private void dummy(ServiceResponse response) {
System.out.println(response.getClass().equals(ServiceResponse.class));
}
您不能保證輸出始終為真,因為response可以是型別CustomServiceResponse(擴展 ServiceResponse)
進一步閱讀:
Java 中的 a.getClass() 和 A.class 有什么區別?
為什么泛型引數上的通配符需要顯式轉換?
Java:有界型別的 getClass()
uj5u.com熱心網友回復:
只有在編譯器無法保證方法的回傳型別(此處restTemplate.exchange)的這些情況下,我們才能使用非型別安全的等效語法:
Mockito.doReturn(ResponseEntity.ok(expectedResponse))
.when(restTemplate)
.exchange(anyString(), any(HttpMethod.class),
Mockito.<HttpEntity<Object>>any(),
Mockito.<ServiceResponse>any().getClass(), anyMap()));
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/311545.html
下一篇:回傳視圖()不重定向頁面
