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

評(píng)論