相信每一個程序猿在寫Unit Test的時候都會碰到一些令人頭疼的問題:如何測試一個rest接口;如何測試一個包含客戶端調(diào)用服務(wù)端的復(fù)雜方法;如何測試一個包含從數(shù)據(jù)庫讀取數(shù)據(jù)的復(fù)雜方法。。。這些問題mockito都可以幫我們輕松地解決。
Mockito是啥?
Mockito 是一個強大的用于 Java 開發(fā)的模擬測試框架, 通過 Mockito 我們可以創(chuàng)建和配置 Mock 對象, 進而簡化有外部依賴的類的測試。簡單來說,創(chuàng)建mock對象之后,這個對象里面的方法是怎么實現(xiàn)的可以不用去關(guān)心,我們只需要給這個方法定義一個輸入、輸出即可。
什么情況下使用Mockito:
假設(shè)現(xiàn)在要測試method A, method A里面又依賴Method B、Method C、Method D,而依賴的這3個method又不好去構(gòu)建(如ObsClient需要真實AK SK,HttpClient需要構(gòu)建客戶端與服務(wù)器,Database相對好構(gòu)建,但是假設(shè)Method C只是從table1、table2聯(lián)合查詢,你還得分別往table1、table2 insert數(shù)據(jù),很繁瑣),這時候可以考慮Mockito進行優(yōu)雅測試,當然如果你想去構(gòu)建真實的測試場景,未免有點舍本逐末了。
Mockito的使用:
1、引進依賴
Maven依賴如下:
《dependency》 《groupId》org.mockito《/groupId》 《artifactId》mockito-core《/artifactId》 《version》1.10.19《/version》 《scope》test《/scope》《/dependency》
代碼中:
import org.mockito.Mockito
2、創(chuàng)建Mock對象
這里需要注意的是scala中只能對伴生對象或者Class創(chuàng)建mock對象,不能直接對Object創(chuàng)建mock對象。Scala中使用Mockito.mock(classOf[…])來創(chuàng)建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
}
}
舉個例子,現(xiàn)在對VpcClient進行mock,從而可以調(diào)用VpcClient里面的getRouteTableList方法。
class UtilSuite { val vpcClient = Mockito.mock(classOf[VpcClient])
VpcClient.setMockClient(vpcClient)}
3、配置Mock對象
Mockito.doReturn(routeTableInfo).when(vpcClient).getRouteTable(projectId, token,url)
當我們有了一個 Mock 對象后, 我們可以調(diào)用對象的方法,并且使用
Mockito.doReturn().when().method
,來設(shè)置當調(diào)用method時,在某輸入下返回某輸出。這里的輸入是要與 method真實的入?yún)⒁恢碌?,輸出也是要與method真實的返回參數(shù)一致。
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)}
總結(jié):
上面講了Mockito的使用場景,以及scala中怎么使用Mockito創(chuàng)建mock對象。與java中使用Mockito有些許的差別,這些如果感興趣的話都可以參考下官方文檔:
官網(wǎng):
http://mockito.org
API文檔:
http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html
項目源碼:
https://github.com/mockito/mockito
編輯:jq
-
JAVA
+關(guān)注
關(guān)注
20文章
2989瀏覽量
109800 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70758 -
REST
+關(guān)注
關(guān)注
0文章
33瀏覽量
9669
原文標題:干貨| 干了這杯Mockito雞尾酒,讓你輕松進行單元測試
文章出處:【微信號:HW-DigitalHome,微信公眾號:華為數(shù)字家庭】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
DLPA3000 ILLUM_HSIDE_DRIVE ILLUM_LSIDE_DRIVE這二個腳外置MOS是什么情況下可以用?
ADS5474模數(shù)轉(zhuǎn)換器的VCM和VREF引腳在什么情況下使用?
ldc1614EVM評估版背面的沒焊電容時用來干嘛的?在什么情況下使用?
ADS7254什么情況下SDO_A會始終呈高電平呢?
請問什么情況下會損壞TLV2548,或者導(dǎo)致INT信號不再反應(yīng)?
TAS5721有個Without MCLK的功能,這個在什么情況下可以沒有MCLK?
tas5754的TDM功能在什么情況下使用,有什么優(yōu)點?
貼片電容什么情況下會出現(xiàn)爆炸?

評論