![](/img/trans.png)
[英]How to mock a final new instance of RestTemplate using Mockito
[英]How to mock new instance of RestTemplate?
我為我的遺留代碼編寫了一個單元測試,類似於:
public class SomeClass {
public SomeResponse logToServer() {
SomeResponse response = null;
try{
RestTemplate restTemplate = new RestTemplate();
SomeRequestBean request = new SomeRequestBean();
response = restTemplate.postForEntity("http://someUrl", request, SomeResponse.class);
System.out.println(response.toString());
} catch(Exception e) {
e.printStackTrace();
}
return response;
}
}
我知道我可以在上面移動 RestTemplate 並將其注釋為@AutoWire
並將其聲明為 bean 類或使用 power mockito 來模擬新實例的創建。 但我不想改變這個遺留代碼,我不惜一切代價避免使用強大的 Mockito,因為僅僅為了一個測試,我不想向我的pom.xml
添加一個全新的依賴項。 所以只是想知道有什么方法可以模擬這個restTemplate嗎?
為了回答您的問題,在您發布的限制下,無法模擬 RestTemplate 並對其進行單元測試。
我確實認為您可以稍微更改遺留代碼,因為此更改不起作用,在這種情況下可能值得。 但我會堅持你,你不能。
關於 power mock 和 power mockito。 雖然我同意應該避免使用這些工具,但不是出於您發布的原因。 請注意,此依賴項屬於測試范圍,即使對於遺留環境,它也不會到達生產環境。 因此,如果優先考慮的是不更改遺留代碼,那么引入 PowerMock 是“最不邪惡的”。
不過,如果我們專門討論 rest 模板,您可以利用一些有關 spring rest 模板的事實,這些事實無論如何都可用於測試它。
選項1
第一種技術(如果環境允許)是使用@RestClientTest
注釋。 它將允許指定被測試的服務,並將提供一個名為MockRestServiceServer
的模擬實現,該模擬實現將代表您在模擬環境中嘗試連接的服務器。 然后,您將能夠指定該服務器的期望值,並希望代碼能夠運行。 注意:這不是單元測試 - 這是一個啟動 spring 上下文的集成測試,因此它比常規單元測試更重/更慢。
在這里你可以找到這個方法的一個工作示例,查看這篇文章它也包含其他技術。
選項 2
第二種技術背后的想法是RestTemplate
實際上是客戶端庫之上的包裝器,它本身不進行任何 http 互通。
它可以配置為與 apache 的 HttpClient、OkHttpClient 一起使用,默認情況下它與 URLConnection 一起為每個請求打開連接。 因此,您可以創建一個測試,將其余客戶端配置為使用您感興趣/選擇的某些特定引擎運行,然后查看如何直接測試使用該引擎的代碼。 根據項目中使用的實際引擎,解決方案會有所不同。
所以,我只是想知道有什么方法可以模擬我的restTemplate嗎?
簡短答案: 否
根據規定的限制,
但是我不想更改此遺留代碼,並且我不惜一切代價避免使用Power Mockito,因為我只想為一個測試添加新的依賴項到pom.xml中
可能沒有其他方法可以模擬restTemplate
。
主題代碼與實現細節/關注緊密耦合,這使得在不使用外部依賴項/工具或不重構代碼以使其無法測試的情況下,很難單獨進行測試。
這是技術債務要求其貸款的情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.