簡體   English   中英

使用方法內部的靜態調用設計Java單元測試

[英]Designing Java unit test with static calls inside method

我正在嘗試為一個類創建單元測試,該類的方法使用apache的fluent-hc庫中的Request.Post方法( http://hc.apache.org/httpcomponents-client-ga/fluent-hc/apidocs /org/apache/http/client/fluent/Request.html )。

問題是我不希望每次運行測試服時都發送實際的請求,即使是單元測試而不是集成測試也是如此。 但是我不知道該如何解決。

我是測試領域的新手,對於大多數時間我無法閱讀的內容,該類的設計存在問題。

public class HttpRequestSenderServiceImpl implements RequestSenderService {

@Override
public Response sendRequest(String address, String messageBody) throws IOException {
    Request request = Request.Post(address).bodyString(messageBody, ContentType.APPLICATION_JSON);
    Response response = request.execute();

    return response;
}

}

我正在使用Spring框架和Spring-Test,Mockito和TestNG作為測試工具。 如果您至少能指出正確的方向,閱讀的任何材料,書籍,視頻或其他任何內容,我將不勝感激。 我只想學習正確的方法。

我找到了解決問題的“解決方案”,但是它們都使用PowerMockito,因為我閱讀的內容對您不利,因為允許模擬靜態方法,構造函數等,這會轉化為不良的編碼做法,這就是我的意思。我試圖避免在這里。

為了您的目的,問題更多是在Apache的fluent-hc Request.Post ,而不是代碼友好,它是靜態的,不是模擬友好的。

您可以使用Executor和模擬執行方法,也可以使用Request.Post將其包裝在另一個低層服務接口中並使用它:

interface RequestSender {
      Response send(String addr,msgBody)
}

class RequestSenderImpl implements RequestSender {
    public Response send(String addr,msgBody) {
       Request request = Request.Post(address).bodyString(messageBody,ContentType.APPLICATION_JSON);
       Response response = request.execute();
       return response;
    }
}

這樣一來,即使沒有模擬,您也可以輕松模擬代碼。

@lujop針對上述問題提供了建議,我認為這是解決問題的一種方法。

但是,對於之前使用模擬框架的聲明,我不是一直都是完全不好的做法。 考慮@lujop的建議,您可能最終會使用Test Double來對RequestSenderImpl及其業務邏輯進行單元測試。

但是會有一個類,例如FluentHCRequestSender ,它將負責實際調用Request.Post 現在,如果您要為所有類編寫UT,則必須使用FluentHCRequestSender框架來測試FluentHCRequestSender以確保該類使用了正確的API。

有一個使用模擬框架進行測試的地方。 但是總的來說,如果依賴項是您,您的團隊或組織創建的類,而最終使用了模擬框架,那就說明設計不好。

為了回答您的資源問題,這些資源通常可以幫助您編寫更好的UT和代碼,

SOLID原則 -在編寫代碼時,這可能永遠是我的腦海。

有效地使用舊版代碼對我很有幫助。

測試驅動的開發 -在我的練習中,要嚴格遵循日常工作並非易事,但這至少迫使我不要推遲UT並與我的實際課程同時進行(如果不是之前) 。

設計模式 -如果您可以訪問或購買圖書館,則可以抓住一本好的設計模式書/視頻。 這些概念看似令人生畏,但我發現其中一些確實對我的日常工作特別是在編寫UT時有用。

但就個人而言,這是學習在代碼庫中查看現有代碼並了解有什么好處和可以改進的最好方法。 我發現尋找和理解由擅長設計的人編寫的代碼比任何書籍都有用。

希望這篇冗長的帖子對您​​有所幫助!

PS-嘗試正確方法的榮譽。 有時它不是應該經常說,盡管應該這樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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