簡體   English   中英

如何模擬 RestTemplate 的新實例?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM