亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

歡迎使用CSDN-markdown編輯器

2019-11-11 05:44:18
字體:
供稿:網(wǎng)友

每次使用各種形形色色的單元測試Mock框架都比較暈,因為寫的不夠多,等學(xué)會了,又流行了一個新的框架,思考為什么老是記不住以及為什么每次都不能胸有成竹的說自己掌握了,想想估計是因為每次都是現(xiàn)學(xué)現(xiàn)用,比較零散,不成體系,所以寫下這個記錄,匯總下到底應(yīng)該學(xué)習(xí),一方面可以幫助在新學(xué)一個單元測試mock框架的時候,按照這個順序?qū)W,學(xué)完之后,按照這個步驟寫CASE;另一方面在使用mockito/powermock時,直接根據(jù)場景復(fù)制代碼。

必知必會(一)- 搞出“假”對象

既然是單元測試的Mock使用, 第一步要學(xué)的是怎么搞出一個假的對象,然后后續(xù)工作其實都是圍繞這個假對象做文章。

根據(jù)應(yīng)用場景不同可以劃分為2種方式:

(1)Mock: 制造一個完全的假對象;

根據(jù)策略的不同,可以定義不同默認(rèn)行為的假對象,例如:

所有方法不進行任何真實調(diào)用,都統(tǒng)一返回null;

Apple apple= Mockito.mock(Apple.class);

所有方法調(diào)用是真實調(diào)用

Apple apple= Mockito.mock(Apple.class,Mockito.CALLS_REAL_METHODS);

(2)Spy: 制造一個假對象,但是是基于已有一個真實的對象。

滿足的需求是,大多方法想用真實實例來調(diào)用,只想定制實例內(nèi)部的一些方法。

Apple apple = new Apple();Apple spiedApple= Mockito.spy(apple);

必知必會(二)- 綁定上“假”對象

第一步搞出假對象后,不會就自動使用上了,否則別人不需要用mock的測試怎么測?所以第二步要做的是讓自己的Mock對象使用上,即綁定上被測目標(biāo)和mocked對象,思考一個類如何使用另外一個類:

1 被測目標(biāo)自己不創(chuàng)建,而是需要使用者傳遞進去的方式:

(a)作為構(gòu)造器參數(shù)直接傳遞進去; (b)使用Set系方法傳遞進去;

2 被測目標(biāo)負(fù)責(zé)創(chuàng)建

本質(zhì)上創(chuàng)建都是new的過程(PS:除了靜態(tài)類), 所以mock掉new,讓new返回要mocked的對象,就搞定所有的事情,但是從被測目標(biāo)看,不可能都是new,可能這個new離被測目標(biāo)還是有一定的距離:例如使用工廠類,使用sPRing的@autowire的等等,所以從代碼層次看有以下幾種情況:

(1) Apple apple = new Apple();(2) apple = AppleFactory.getIntance();(3)@Autowiredprivate Apple apple;

(a)針對直接new的方式:讓new出一個對象都返回mock的實例

class AppleTree{private Apple apple= new Apple();}@RunWith(PowerMockRunner.class)@PrepareForTest({AppleTree.class}) //don't miss this statement and pay more attention it is caller for Apple, not Apple.public class TestNewObject { @Testpublic void test() throws Exception {Apple apple= Mockito.mock(Apple.class);PowerMockito.whenNew(Apple.class).withNoArguments().thenReturn(apple);}

(b)針對使用其他類來創(chuàng)建:mock創(chuàng)建方法

一般都是靜態(tài)工廠這種情況,如果不是“靜態(tài)工廠”,是另外一個實例的普通方法創(chuàng)建的,則需要mock那個實例了。 這里僅考慮一般情況,即面對靜態(tài)工廠方法,mockito暫時不支持靜態(tài)類的mock,所以需要結(jié)合powermock:

@RunWith(PowerMockRunner.class)@PrepareForTest({AppleFactory.class}) //don't miss this statementpublic class TestStaticMethod {@Testpublic void test() throws Exception {Apple apple= Mockito.mock(Apple.class);PowerMockito.mockStatic(AppleFactory.class);PowerMockito.when(AppleFactory.getInstance()).thenReturn(apple);}

(c)還有一種情況是使用框架自動創(chuàng)建的,例如使用Spring的@Autowired 此時可以使用java反射來直接設(shè)置進去,但是既然是使用mock工具,也可以使用標(biāo)準(zhǔn)點的方式,例如:

Apple apple= Mockito.mock(Apple.class);Whitebox.setInternalState(testAppleInstance, "apple", apple);

必知必會(三)- Mock對象上做文章-偽造行為

學(xué)完前面2步后,就可以開始考慮干活了,既然搞出假的mock對象,不可能不去做一些“假動作”: 匹配上一個方法,然后做出一個行為:

其中匹配包括2種:

粗略匹配:

Mockito.when(mockedApple.getOwner(Mockito.anyString()).thenReturn("tom");

精確匹配:

Mockito.when(mockedApple.getOwner(Mockito.eq("somegstring"))).thenReturn("tom");

行為包括以下三種:

(1) 定義方法非真實調(diào)用;

設(shè)置其返回值:

Mockito.when(mockedApple.getOwner()).thenReturn("tom");

設(shè)置其拋出異常:

Mockito.when(mockedApple.getOwner()).thenThrow(new RuntimeException());

(2)定義方法去進行真實調(diào)用:

Mockito.when(mockedApple.getNumbers()).thenCallRealMethod();

(3)自適應(yīng)變化:

例如設(shè)置每次返回的不同可以使用:

when(mockedApple.getOwner()) .thenReturn("one") //第一次行為 .thenCallRealMethod() //第二次行為 .thenThrow(new RuntimeException()); //第三次行為

其他形式的各種高級搞法,不考慮。

必知必會(四)- Mock對象上做文章-驗證行為

不考慮本身case就可以寫出驗證點,有時候需要驗證一些mocked對象上的行為來驗證case是否成功,按照需要驗證的要點來看: (1)驗證調(diào)用與否或調(diào)用次數(shù)

Mockito.verify(mockedApple, Mockito.times(2)).someMethod(Mockito.anyString()); Mockito.verify(mockedApple, Mockito.never()).someMethod(Mockito.anyString());

(2) 驗證調(diào)用時間

Mockito.verify(mockedApple, Mockito.timeout(10)).someMethod(Mockito.anyString());

(3)驗證調(diào)用參數(shù)值

方式1:Matcher-直接驗證參數(shù)

簡單校驗:

Mockito.verify(mockedApple, times(2)).someMethod(Mockito.eq("expectedString")); //mockito要求此處不能直接寫"expectedString"

自動義校驗方法:

使用Mockito.argThat+ArgumentMatcher(Matchers.argThat(Matcher matcher) ):

Mockito.verify(mockedApple).someMethod(Mockito.argThat(new ArgumentMatcher<String>(){ @Override public boolean matches(String argument) { return argument.equals("expectedString");}}));

方式2:Captor-捕獲出參數(shù),然后校驗

使用ArgumentCaptor捕獲參數(shù),然后進一步處理的

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);Mockito.verify(mockedApple).someMethod(argument.capture());String value = argument.getValue();Assert.assertEqual(value, expectedString);

區(qū)別: Also, sometimes ArgumentCaptor may be a better fit than custom matcher. For example, if custom argument matcher is not likely to be reused or you just need it to assert on argument values to complete verification of behavior.

(4) 驗證調(diào)用順序

主要包括兩種,一種是同一個mock對象的方法調(diào)用順序,另外一種是跨mock對象的方法調(diào)用順序驗證,分別參考一下兩種示例:

InOrder inOrder = Mockito.inOrder(mockedApple);inOrder.verify(mockedApple).firstMethodCallName();inOrder.verify(mockedApple).secondMethodCallName();InOrder inOrder = Mockito.inOrder(mockedApple,mockedOrange);inOrder.verify(mockedApple).methodCallName();inOrder.verify(mockedOrange).methodCallName();

對于各種驗證,有時候需要reset mock對象,以便處理共享等問題,可以使用Mockito.reset()。

總結(jié):

對于一個新的單元測試框架大體要搞清楚幾件事情:“偽造對象-綁定對象-定制對象動作-驗證” ,核心關(guān)鍵是mock/spy it then when customized match one method do something and verify after executed寫具體case的時候,也可以follow四個步驟來搞。另外上面演示的都是基本要點,其他都是各種形式的變種或高級用法,同時每種框架都有自己的特殊要求,必須遵從。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产成人精品久久一区二区小说| 五月天亚洲综合| 色综合视频网站| 毛片在线导航| 精品国产区一区| 国产又黄又粗视频| 欧美久久精品一级c片| 九九这里只有精品视频| 91久久国产综合久久91猫猫| 国产成人精品一区二区三区视频| 青青在线免费观看| 日本黄色www| 亚洲精品欧美综合四区| 国产成人免费在线| 日韩欧美一区二区在线观看| 久久国产精品无码网站| 性色av无码久久一区二区三区| 影音先锋中文在线播放| 亚洲黄色片免费看| 国家队第一季免费高清在线观看| 久久人体大尺度| 日韩一区亚洲二区| 日韩欧美黄色片| 国产丝袜一区二区三区免费视频| 欧美久久久久中文字幕| 中文字幕中文在线| 日韩精品亚洲一区二区三区免费| 国产女人18毛片水18精| 欧美日韩午夜激情| 日韩一级精品| 日本高清免费不卡视频| 国产又爽又黄又刺激的软件| 日韩欧美中文一区| 人妻熟女一二三区夜夜爱| 波多野结衣家庭教师| 国产午夜精品免费一区二区三区| 亚洲91网站| 久久国内精品| 日韩 欧美 高清| 国产无套在线观看| 激情五月激情综合网| 中文在线最新版地址| 97在线观看视频| 亚洲av无码一区二区乱子伦| 神马一区二区三区| 亚洲欧美影音先锋| 亚洲成人中文字幕| 岳乳丰满一区二区三区| 日本jizzjizz| 亚洲熟妇av日韩熟妇在线| 欧美一区二区三区视频免费| 北岛玲一区二区| 亚洲成人日韩在线| 日韩精品亚洲人成在线观看| 免费国产阿v视频在线观看| 精品人妻一区二区三区免费看| 懂色av一区二区三区四区| 成人婷婷网色偷偷亚洲男人的天堂| 国产精品久久久久久妇女6080| 免费av在线网址| 中文字幕在线1| 国产精品视频123| 国产福利一区视频| 久久久久国产精品夜夜夜夜夜| 超碰91在线播放| 影音先锋5566资源站| 色诱女教师一区二区三区| 日韩视频免费看| 久久久人成影片免费观看| 精品黑人一区二区三区久久| 国产人妻人伦精品1国产丝袜| 日本一区二区精品| av电影在线观看一区二区三区| 欧美在线91| 日本熟妇色xxxxx日本免费看| 天天夜碰日日摸日日澡| 欧美日韩裸体免费视频| 无码人妻丰满熟妇啪啪欧美| 欧美色资源站| 91好吊色国产欧美日韩在线| 91大片在线观看| 欧美激情第一页在线观看| 欧美精品久久久久久久小说| 97人妻精品一区二区三区动漫| 二区视频在线观看| 亚洲区在线播放| 久久这里只有精品国产| 日韩在线激情视频| 色综合天天综合网天天看片| 久久99精品国产99久久| 亚洲网站免费观看| 国产精品1区2区3区在线观看| 国产精品99久久久久久人| 黑人与亚洲人色ⅹvideos| 国产一区二区三区网| 第一中文字幕在线| 国产亚洲福利| 图片区乱熟图片区亚洲| 天天干天天色天天| 在线观看国产精品网站| 国产免费www| 久久夜色精品一区| 91九色蝌蚪91por成人| 亚洲最大的成人网| 偷偷www综合久久久久久久| 国产美女精品视频免费播放软件| 午夜18视频在线观看| 波多野结衣在线电影| caopon在线免费视频| 日韩亚洲在线观看| 日本久久中文字幕| 噜噜噜久久亚洲精品国产品小说| 一级网站在线观看| 中文字幕一区二区三区日韩精品| 美腿丝袜亚洲三区| 异国色恋浪漫潭| 色网在线播放| 黑人と日本人の交わりビデオ| 不卡av影片| 亚洲色图25p| 欧美激情亚洲精品| 99re热这里只有精品免费视频| 18+视频在线观看| 久久亚洲一区二区三区明星换脸| 国产国语亲子伦亲子| 蜜桃精品噜噜噜成人av| 久久99久国产精品黄毛片入口| 成人性做爰aaa片免费看不忠| 国产www网站| 97视频在线观看网站| 任你躁在线精品免费| 亚洲日韩中文字幕一区| 一级片aaaa| 嫩模一区二区三区| 久草视频免费看| 日韩久久一区二区三区| 国产91九色蝌蚪| 免费在线观看成人| 久久超碰99| 宅男在线精品国产免费观看| 亚洲一级二级三级在线免费观看| 丰满岳乱妇一区二区| 免费看黄色的视频| 天堂中文在线网| 狠狠色噜噜狠狠狠狠888奇米| 成人va天堂| 色偷偷网站视频| 777一区二区| 操日韩av在线电影| 91福利在线观看| 久久精品国产**网站演员| www.欧美精品| 日韩精品无码一区二区三区| 精品全国在线一区二区| 女人扒开双腿让男人捅| 国产毛片久久| 欧美人成在线观看| 五月天婷婷综合社区| 国产一区二区精品调教| 粉嫩高潮美女一区二区三区| 肉色欧美久久久久久久免费看| 男人c女人视频| 色网在线免费观看| 国产一区二区精品久久91| 欧美黄色免费在线观看| 神马久久资源| 成人网址大全| 最爽无遮挡行房视频在线| 成人免费看片网站| 成人精品在线视频| 三级毛片在线看| 黄页视频在线免费观看| 欧美中文字幕一区二区| 欧美黑人xxxx| 欧美日韩电影在线| www.玖玖玖| 免费看日本一区二区| 亚洲人体大胆视频| 国产又粗又猛又爽又黄| www.com毛片| 懂色av一区二区三区免费观看| 激情小说中文字幕| 国产综合久久久久久鬼色| 国产999免费视频| 久久99精品一区二区三区| 在线观看福利片| 国产裸舞福利在线视频合集| av资源站一区| 亚洲成色精品| 国产交换配乱淫视频免费| 亚洲欧美自拍偷拍色图| 91精品免费久久久久久久久| 亚洲欧美国产一区二区三区| 91影院在线免费观看| 2019最新中文字幕| 黄色国产在线| 91九色精品国产一区二区| 99国产精品99久久久久久粉嫩| 久久.com| 日韩成人免费观看| 国产精品久久久久久久久妇女| 2021最新国产精品一区| 高端美女服务在线视频播放| www.狠狠插| 久久国产精品久久国产精品| 欧美一卡二卡三卡四卡| 中文字幕中文在线| 九色视频网站在线观看| 成人xxx免费视频播放| 黄色片网站免费在线观看| 91久久国产综合久久91精品网站| av在线电影免费观看| 日本韩国在线视频| 伊人久久免费视频| 久久综合中文色婷婷| 成人国产一区二区三区| 中文字幕一区二区三区人妻不卡| 亚洲日本va在线观看| 希岛爱理中文字幕| 自拍av一区二区三区| 五月激情综合色| 五月天视频在线观看| 欧美国产小视频| 9a蜜桃久久久久久免费| 国产成人一二| 极品盗摄国产盗摄合集| 亚洲精品7777xxxx青睐| 欧美成人精品在线视频| 亚洲一区二区三区四区不卡| 999这里有精品| 黄色aaa级片| 在线视频观看你懂的| 日韩西西人体444www| 国产乱码一区二区三区四区| 九义人在线观看完整免费版电视剧| 国产精品30p| 992tv在线观看| 黄色片一区二区| 青娱乐极品盛宴一区二区| 精品人妻一区二区免费| 免费一区二区三区视频狠狠| 最新亚洲伊人网| 亚洲高清资源| 欧美动物xxx| 日本一区二区免费不卡| 成年人的黄色片| 石原莉奈一区二区三区高清在线| 欧美日韩成人在线播放| 国产欧美一区二区三区久久| 五月天婷婷丁香网| 成人高清免费在线播放| 三年中国中文在线观看免费播放| 亚洲精品乱码久久久久久日本蜜臀| 暴力调教一区二区三区| 中文字幕巨乱亚洲| 1234区在线观看视频免费| 一级毛片免费在线| 国产精品久久久久久久久免费桃花| 91国产精品成人| 黄色特一级视频| 领导边摸边吃奶边做爽在线观看| 91看片在线| 久久久久99精品一区| 欧美亚洲色综久久精品国产| 亚洲成人在线播放| 亚洲欧美精品一区二区| 99免费精品视频| 在线成人私人影院| 日韩毛片在线免费观看| 男人搞女人网站| wwwxx免费| 亚洲精品裸体| 欧美在线在线| 欧美精品三级在线| 久久97超碰色| 久久精品二区亚洲w码| 亚洲午夜91| 国产午夜无码视频在线观看| 国产无人区码熟妇毛片多| 国产精品自在自线| 综合久久久久久| 电影一区中文字幕| 国内成人自拍视频| 久久久久久久久久看片| 影音先锋在线亚洲| 国产精品一区二区果冻传媒| 天天综合亚洲| 最新日韩一区| 黄色成人在线网址| 亚洲最大的成人网| 天天弄天天操| 亚洲国产影院| 国产精品久久久久久av下载红粉| 中文字幕天堂在线| 久久久一区二区三区| 免费91视频| 欧美日韩黄色一级片| 日韩欧美中文字幕在线观看| 欧美色999| 日韩中文字幕高清在线观看| 奇米影视狠狠狠| 久久午夜夜伦鲁鲁一区二区| 狠狠躁狠狠躁视频专区| 色综合久久中文字幕综合网| 欧美精品videosbestsex另类| 亚洲七七久久综合桃花剧情介绍| 欧美日韩aaa| 亚洲欧洲精品一区二区三区不卡| 亚洲人成伊人成综合网小说| 在线精品自拍| 欧美日本免费| 手机av免费在线| 亚洲理论片在线观看| 久久久91精品国产一区二区三区| 国产欧美一区二区三区久久| 亚洲va国产日韩欧美精品色婷婷| 精品夜夜嗨av一区二区三区| 97精品在线播放| 日韩免费高清在线| 大黑人xxx| 美女黄色一级视频| 国产高清一级片| 成人av网站观看| 91美剧网在线播放| 国产精成人品免费观看| 欧美激情久久久久| av网站免费观看| 美女露胸一区二区三区|