Wiremock 與 Mockito
Mockito 構建於單元測試,而 Wiremock 專為整合測試而構建。Mockito 自稱“一個味道極佳的模擬框架”,而 Wiremock 將自己描述為“基於 HTTP 的 API 模擬器”。
Wiremock 和 mockito 都是用於測試的技術,廣泛應用於現實世界應用程式的單元和整合測試中。開發人員必須瞭解這兩個重要的術語以及它們之間的區別,以便有效地使用它們。
因此,本文將詳細介紹這兩個廣泛使用的工具之間的主要區別。
什麼是 Wiremock?
Wiremock 是一種用於模擬基於 HTTP 的 API 的工具,可以在單元測試、桌面或稱為 Wiremock 的測試環境中使用。它也可以稱為偽造伺服器、服務虛擬化工具或基於 HTTP 的 API 模擬器。如果依賴的 API 出現以下情況,它允許您繼續工作:
故障
昂貴
不可用
不完整
它有助於測試邊緣情況和故障模式。它執行速度快,大大縮短了構建時間。簡單來說,Wiremock 是一個用於整合測試的模擬平臺。當系統與一個或多個內部/外部元件或設施互動時,尤其是在實施整合測試時,它主要被使用。
示例
例如,我們正在構建一個名為 Musizz 的應用程式,並且該應用程式中有一個功能需要連線到其他音樂應用程式(如 Ganna、Spotify 等)提供的外部 API。但這裡的問題是如何對外部 API 進行整合測試。因此,將有兩種方法可以解決這個問題。
方法
方法 1
這種方法非常明顯。這意味著我們可以使用多個測試環境或實際生產環境對其進行測試。但這種方法也帶來了一些挑戰:
有時呼叫 API 成本很高
外部 API 系統可能並非始終可用,這意味著我們完全依賴於系統中的任何停機時間
有時,它不包含測試環境
圖 1
方法 2
第二種方法是使用一個 Web 伺服器,該伺服器可以模擬對依賴項接收到的請求的響應。
圖 2
什麼是 Mockito?
同樣,Mockito 是一個用於在 Java 應用程式中測試開源單元的框架。它對於建立可測試的應用程式至關重要。專注於評估特定軟體單元的軟體測試稱為單元測試。使用此框架的主要目的是透過在測試程式碼中使用外部依賴項的模擬來簡化測試開發。結果,mockito 提供了更最佳化、更易訪問和更具適應性的測試程式碼。它還可以與 JUnit 和 TestNG 等其他框架協作。
方法
Mockito 模擬提供了許多不同的模擬類的方法。其中一些列在下面:
方法 1
可以使用它建立特定類或介面的模擬物件。Mockito 中有五個 mock() 方法,每個方法都有一個唯一的引數。如果我們沒有為模擬物件分配任何內容,它們將返回預設值。所有五種技術都執行相同的模擬物件任務。
下面列出了所有五個 mock() 方法
使用 Class 的 mock()
它用於開發具體介面的模擬物件。它將介面名稱作為引數。
語法
<T> mock(Class<T> classToMock)
使用 Answer 的 mock()
它用於使用特定過程開發介面的模擬物件。這是一種高階模擬方法,在處理遺留系統時可能很有用。它將 Answer 作為引數以及介面名稱一起使用。Answer 是預配置模擬答案的列舉。
語法
<T> mock(Class<T> classToMock,Answer defaultAnswer)
使用 MockSettings 的 mock()
它用於使用一些非標準設定開發模擬物件。它將 MockSettings 作為附加設定引數以及介面名稱一起使用。它允許建立具有附加設定的模擬物件。
語法
<T> mock(Class<T> classToMock,MockSettings mockSettings)
使用 ReturnValues 的 mock()
它允許建立已分配介面的模擬物件。現在,它已棄用,因為 ReturnValues 已被 Answer 替換。
語法
<T> mock(Class<T> classToMock,ReturnValues returnValues)
使用 String 的 mock()
它用於透過指定模擬名稱來開發模擬物件。在除錯過程中,命名模擬物件可能會有所幫助,而在大型複雜程式碼中使用它則不是一個好選擇。
語法
<T> mock(Class<T> classToMock,String name)
以下程式碼展示瞭如何使用 mock() 方法:
ToDoService doService = mock(ToDoService.class);
方法 2
Mockito 提供的 spy 方法是一種僅部分模擬物件的方法。在使用 spy 方法時,將從已存在的真實物件中建立間諜或存根。在不使用 spy 存根方法的情況下,將呼叫真實方法的行為。spy() 方法的主要目的是覆蓋真實物件的唯一方法。spy() 方法執行的任務之一是驗證特定方法的呼叫。
Mockito 有兩種 spy() 方法:
spy() 方法
它開發真實物件的間諜。除非存根,否則它會呼叫真實方法。我們應該謹慎且很少使用真實間諜。例如,在處理遺留程式碼時。
語法−
<T> spy(T object)
使用 Class 的 spy() 方法
它在類而不是物件上開發一個間諜物件。spy(T object) 方法對於監視抽象類特別有用,因為它們無法例項化。
語法
<T> spy(Class<T> classToSpy)
以下程式碼展示瞭如何使用 spy() 方法:
ListspyArrayList = spy(ArrayList.class);
為什麼我們應該使用 Wiremock 而不是 Mockito?
對於基於 HTTP 的 API,Wiremock 提供了一個模擬器,而 Mockito 提供了特徵或專案的模擬模型。如果我們的目標是在不測試任何程式碼的情況下返回物件或響應以呼叫鬆弛提供程式、獲取 HTTP 響應並反序列化相同內容,那麼我們使用 Mockito 模擬基於 HTTP 的整個過程。使用 Wiremock 將允許我們進行儘可能真實的執行時測試,因為它模擬了 REST 名稱的呼叫和響應的反序列化。
WireMock 和 Mockito 之間的區別
WIREMOCK |
MOCKITO |
---|---|
Web 伺服器充當真實 API |
沒有 Web 伺服器 |
真實的 HTTP 呼叫 |
沒有可用的 HTTP 呼叫 |
應用程式程式碼的外部 |
應用程式程式碼的一部分 |
可以模擬網路呼叫 |
無法模擬網路呼叫 |
它不特定於語言。這意味著,如果您正在處理基於 Rest 的響應,無論您使用的是 Java、Python 還是 Groovy,都可以簡單地使用 Wiremock。 |
但是,Mockito 是一個模擬庫,專門針對某種語言。例如,在 Java 程式設計中,模擬庫稱為 Mockito,而在其他程式語言中,它則被稱為不同的名稱。 |
結論
Wiremock 和 mockito 在許多方面都彼此不同。Wiremock 可以模擬網路呼叫,而 mockito 則不能模擬網路呼叫。Mockito 也是一個專門針對某種語言的模擬庫,但 Wiremock 在語言方面並不具體。