摘要:相信每個程序猿在寫Unit Test的時候都會碰到一些使人頭疼的問題:如何測試一個rest接口;如何測試一個包含客戶端調用服務端的複雜方法;如何測試一個包含從數據庫讀取數據的複雜方法。。。這些問題mockito均可以幫咱們輕鬆地解決。Mockito是啥?Mockito 是一個強大的用於 Java 開發的模擬測試框架, 經過 Mockito 咱們能夠建立和配置 Mock 對象, 進而簡化有外...
本文分享自華爲雲社區《mockito——讓你輕鬆地進行單元測試的強大工具》,做者:數據湖愛好者。html
相信每個程序猿在寫Unit Test的時候都會碰到一些使人頭疼的問題:如何測試一個rest接口;如何測試一個包含客戶端調用服務端的複雜方法;如何測試一個包含從數據庫讀取數據的複雜方法。。。這些問題Mockito均可以幫咱們輕鬆地解決。java
Mockito 是一個強大的用於 Java 開發的模擬測試框架, 經過 Mockito 咱們能夠建立和配置 Mock 對象, 進而簡化有外部依賴的類的測試。簡單來講,建立mock對象以後,這個對象裏面的方法是怎麼實現的能夠不用去關心,咱們只須要給這個方法定義一個輸入、輸出便可。git
假設如今要測試method A, method A裏面又依賴Method B、Method C、Method D,而依賴的這3個method又很差去構建(如ObsClient須要真實AK SK,HttpClient須要構建客戶端與服務器,Database相對好構建,可是假設Method C只是從table一、table2聯合查詢,你還得分別往table一、table2 insert數據,很繁瑣),這時候能夠考慮Mockito進行優雅測試,固然若是你想去構建真實的測試場景,未免有點捨本逐末了~~~github
Maven依賴以下:算法
<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>1.10.19</version> <scope>test</scope> </dependency>
代碼中:import org.mockito.Mockito數據庫
這裏須要注意的是scala中只能對伴生對象或者Class建立mock對象,不能直接對Object建立mock對象。Scala中使用Mockito.mock(classOf[…])來建立mock對象服務器
class VpcClient { def getRouteTable(projectId: String, token: String, url: String): Seq[RouteTable] = { val header = Map(RequestAttributes.X_AUTH_TOKEN -> token, "Content-Type" -> MediaType.APPLICATION_JSON) val response = restClient.get(url, header) } } object VpcClient { private lazy val _instance: VpcClient = new VpcClient(conf) private var mockClient: VpcClient = _ def getInstance(): VpcClient = { // Keep original logic for other ut, which didn't set mock client. if (RuntimeEnvironment.isTesting && null != mockClient) { return mockClient } _instance } // only used for UT def setMockClient(vpcClient: VpcClient): Unit = { mockClient = vpcClient } }
舉個例子,如今對VpcClient進行mock,從而能夠調用VpcClient裏面的getRouteTableList方法。框架
class UtilSuite { val vpcClient = Mockito.mock(classOf[VpcClient]) VpcClient.setMockClient(vpcClient) }
Mockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId, token,url)
當咱們有了一個 Mock 對象後, 咱們能夠調用對象的方法,而且使用Mockito.doReturn().when().method,來設置當調用method時,在某輸入下返回某輸出。這裏的輸入是要與 method真實的入參一致的,輸出也是要與method真實的返回參數一致。工具
class UtilSuite { val vpcClient = Mockito.mock(classOf[VpcClient]) VpcClient.setMockClient(vpcClient) val projectId = "projectId" val token = "token" val url= "url" val routeTableInfo = new RouteTableInfo Mockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId, token, url) }
上面講了Mockito的使用場景,以及scala中怎麼使用Mockito建立mock對象。與java中使用Mockito有些許的差異,這些若是感興趣的話均可以參考下官方文檔:單元測試
獲取更多 AI 相關數據、算法、模型等 AI 資產,請點擊「瞭解更多」,AI Gallery等您!