JUnit 中的 Mock 方法實現(xiàn)主要依賴于 Mockito 框架,Mockito 是一個流行的 Java 測試框架吼蚁,用于創(chuàng)建和管理測試中的模擬對象(Mocks)漩蟆。Mockito 的原理如下:
1. 動態(tài)代理:
Mockito 使用 Java 的動態(tài)代理機制來創(chuàng)建模擬對象罚斗。動態(tài)代理是一種在運行時創(chuàng)建代理對象的技術跺株,它可以在不改變原始類的情況下為其創(chuàng)建代理對象,以攔截對原始類方法的調(diào)用府喳。通過動態(tài)代理蒲肋,Mockito 可以在運行時生成模擬對象并攔截模擬對象上的方法調(diào)用。
2. Mock 對象的創(chuàng)建:
Mockito 通過調(diào)用靜態(tài)方法 Mockito.mock() 來創(chuàng)建模擬對象。在創(chuàng)建模擬對象時兜粘,Mockito 會生成一個代理對象申窘,代理對象實現(xiàn)了被模擬類的接口或是繼承了被模擬類的父類,從而可以用作被測試類中依賴的對象孔轴。
3. 方法調(diào)用攔截:
當測試代碼調(diào)用模擬對象的方法時剃法,實際上是調(diào)用了代理對象的方法。Mockito 的代理對象會攔截這些方法調(diào)用路鹰,并根據(jù)預先定義的行為返回模擬的結(jié)果贷洲。
4. 行為定義:
在創(chuàng)建模擬對象后,我們可以使用 Mockito 提供的 API 來定義模擬對象的行為晋柱。例如优构,我們可以使用 when() 方法來定義模擬對象的方法在被調(diào)用時返回的結(jié)果∪そ铮可以使用 thenReturn()俩块、thenThrow() 等方法來指定返回值或拋出異常黎休。
5. 驗證調(diào)用:
在測試中浓领,我們可以使用 Mockito 提供的 verify() 方法來驗證模擬對象的方法是否被正確調(diào)用。例如势腮,我們可以驗證模擬對象的某個方法被調(diào)用了幾次联贩,或者被調(diào)用的順序等。
總體而言捎拯,Mockito 的原理是通過動態(tài)代理技術創(chuàng)建模擬對象泪幌,并攔截模擬對象上的方法調(diào)用,根據(jù)預先定義的行為返回模擬結(jié)果署照。這樣祸泪,我們可以在測試中模擬依賴對象的行為,使得測試更加靈活建芙、可控没隘,從而更容易編寫全面的單元測試。
Mock方法的使用
驗證方法沒有被調(diào)用
verifyZeroInteractions(eventBusiness.publishEventMessage(ExceptionTypeEnum.BUSINESS, receiveResultBO.getErrorCode(), receiveResultBO.getErrorMessage(), JSON.toJSONString(receiveActionBO)));
verify(eventBusiness, times(0)).publishEventMessage(ExceptionTypeEnum.BUSINESS, receiveResultBO.getErrorCode(), receiveResultBO.getErrorMessage(), JSON.toJSONString(receiveActionBO));
verify(eventBusiness, never()).publishEventMessage(ExceptionTypeEnum.BUSINESS, receiveResultBO.getErrorCode(), receiveResultBO.getErrorMessage(), JSON.toJSONString(receiveActionBO));