日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 學院 > 開發設計 > 正文

歡迎使用CSDN-markdown編輯器

2019-11-11 05:44:18
字體:
來源:轉載
供稿:網友

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

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

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

根據應用場景不同可以劃分為2種方式:

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

根據策略的不同,可以定義不同默認行為的假對象,例如:

所有方法不進行任何真實調用,都統一返回null;

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

所有方法調用是真實調用

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

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

滿足的需求是,大多方法想用真實實例來調用,只想定制實例內部的一些方法。

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

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

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

1 被測目標自己不創建,而是需要使用者傳遞進去的方式:

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

2 被測目標負責創建

本質上創建都是new的過程(PS:除了靜態類), 所以mock掉new,讓new返回要mocked的對象,就搞定所有的事情,但是從被測目標看,不可能都是new,可能這個new離被測目標還是有一定的距離:例如使用工廠類,使用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)針對使用其他類來創建:mock創建方法

一般都是靜態工廠這種情況,如果不是“靜態工廠”,是另外一個實例的普通方法創建的,則需要mock那個實例了。 這里僅考慮一般情況,即面對靜態工廠方法,mockito暫時不支持靜態類的mock,所以需要結合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)還有一種情況是使用框架自動創建的,例如使用Spring的@Autowired 此時可以使用java反射來直接設置進去,但是既然是使用mock工具,也可以使用標準點的方式,例如:

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

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

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

其中匹配包括2種:

粗略匹配:

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

精確匹配:

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

行為包括以下三種:

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

設置其返回值:

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

設置其拋出異常:

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

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

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

(3)自適應變化:

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

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

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

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

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

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

(2) 驗證調用時間

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

(3)驗證調用參數值

方式1:Matcher-直接驗證參數

簡單校驗:

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-捕獲出參數,然后校驗

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

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

區別: 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) 驗證調用順序

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

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()。

總結:

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
91精选在线| 最新日韩中文字幕| 久久久久蜜桃| 欧美日韩综合不卡| 国产一区日韩欧美| 日韩在线欧美| 97最新国自产拍视频在线完整在线看| 大香一本蕉伊线亚洲网| 亚洲免费视频一区| 91精品在线国产| 在线观看区一区二| 国产拍揄自揄精品视频麻豆| 国产成人日日夜夜| 五月综合激情日本mⅴ| 久久精品国产99| 国产高清在线视频| 免费高清特黄a大片| 欧美亚洲另类制服自拍| 日韩免费看网站| 国产日韩av一区| 国产在线www| 欧美日韩久久久| www日韩在线观看| 中文字幕欧美人妻精品一区蜜臀| 拍真实国产伦偷精品| 国产在线第一页| 日韩精品欧美| 中文字幕日韩视频| 日韩久久在线| 欧美日本精品| 精品视频资源站| 国产福利在线看| 日韩激情一区| 国产乱国产乱300精品| 中文字幕日韩在线观看| 日韩中文字幕在线视频播放| 国产绿帽一区二区三区| 77777_亚洲午夜久久多人| 在线看欧美日韩| 日韩在线中文视频| 91精品国产调教在线观看| 91蜜桃婷婷狠狠久久综合9色| 蜜桃视频一日韩欧美专区| 日韩欧美在线综合网| 国产免费久久| 91精品国产高清久久久久久| 91精品视频播放| 国产一二三四| 日韩欧美国产成人精品免费| 中文字幕在线播放一区| 91精品国产91久久久久久久久 | 日韩精品在线中文字幕| 国产日韩精品电影| 国自产拍在线网站网址视频| 国产福利精品导航| av免费网站在线观看| 午夜视频在线观看一区| 中文字幕高清在线播放| 一区二区高清视频| 日韩欧美中文字幕在线播放| 精品999视频| 日韩精品手机在线| wwwwww在线观看| 久久精品在线观看| 精品视频在线导航| 欧美日韩色综合| 中文字幕中文字幕精品| 国产在线第一页| 欧美日韩中文字幕在线观看| 久久久久久欧美| 99久久精品国产成人一区二区| 91精品在线观看视频| 日韩中文字幕亚洲| 欧美 日韩 国产在线| 在线不卡日本| 国产婷婷在线观看| 亚洲综合日韩欧美| 亚洲国产www| 国产成人精品999| 日韩在线视频网| 午夜少妇久久久久久久久| 国产日韩av高清| 精品国产91乱高清在线观看| 亚洲а∨精品天堂在线| 日韩在线精品| 日韩欧美在线网址| 日韩欧美在线视频日韩欧美在线视频| 欧美va亚洲va日韩∨a综合色| 一级片免费在线播放| 国产欧美日韩在线看| 日韩视频在线一区二区| 99视频精品全国免费| 日韩国产欧美在线视频| 欧美日韩国产一二| 九九九精品视频| www.精品av.com| 欧美三级在线看| 精品视频在线视频| 午夜伦欧美伦电影理论片| 亚洲福利在线视频| 欧美日韩人人澡狠狠躁视频| 久草视频观看| 亚洲一区中文字幕在线观看| 日韩免费高清一区二区| 日韩精品在线视频观看| 日韩精品欧美| 99精品免费观看| 国产裸体歌舞团一区二区| 亚洲永久免费视频| 亚洲一级二级| 中文字幕在线视频精品| 欧美日韩国产免费| 精品视频三区| 91精品国产91久久久久久不卡| 天堂在线视频中文网| 亚洲视频资源在线| 日韩美女视频一区二区在线观看| 一区二区视频国产| 中文字幕日韩免费视频| 国产黄色片中文字幕| 狠狠色综合色区| 国产福利精品导航| 国产调教精品| 精品久久蜜桃| 欧美日韩三级一区| 亚洲一区在线视频观看| 日韩视频不卡中文| 久久人人88| 香蕉人人精品| 欧美日韩精品在线| 国精品产品一区| 欧美一级免费在线观看| 五月天久久比比资源色| 91麻豆视频网站| 欧美日韩高清一区二区| 在线观看区一区二| 中文字幕线观看| 日韩不卡一区二区| 91精品国产91综合久久蜜臀| 中文官网资源新版中文第二页在线观看 | 中文在线视频| 91精品视频免费在线观看| 欧美日韩高清在线| 福利在线国产| 亚洲三级免费看| av首页在线| 日韩免费看网站| 欧美日韩亚洲天堂| 欧美中文字幕视频在线观看| 一级日本免费的| 国产 日韩 欧美 综合| 被陌生人带去卫生间啪到腿软| 亚洲大片精品永久免费| 中文字幕久久精品| av首页在线| 国产福利精品导航| 欧美国产综合在线V| 日韩视频中文字幕| 福利一区二区| av一级在线| 国产日韩亚洲欧美| 亚洲乱码在线观看| 在线视频国产三级| 国产日韩精品在线| 51精品免费网站| 中文字幕日韩在线视频| 国产羞羞视频在线播放| 中文字幕欧美国内| 国产亚洲福利| 国产福利在线看| 国产成人综合精品| 欧美日中文字幕| 日韩亚洲欧美中文高清在线| 欧美日韩中文精品| 国产欧美高清在线| 自拍日韩亚洲一区在线| 91精品国产综合久久精品| 亚洲综合在线电影| 欧美日韩三级视频| 男人的天堂网av| 中文在线а√在线8| 日韩av中文字幕一区| 久久久99免费| 欧洲精品二区| 91色在线看| 国产偷国产偷亚洲清高网站 | 精品无人国产偷自产在线| 日韩在线中文字幕| 亚洲一区视频在线观看视频| 亚洲一区在线观看网站| 欧美一级手机免费观看片| 国产福利三区| 中文字幕4区| 一区二区精品免费| 国产欧美三级| 欧美 日韩 国产在线观看| 被陌生人带去卫生间啪到腿软| 国产精品一区二三区| 国产日韩在线亚洲字幕中文| 日本精品国语自产拍在线观看| 国产色综合网| 国产调教精品| 精品久久久三级| 欧美 日韩 国产 高清| 91一区二区| 99精品免费观看| 视频一区二区不卡| 久久精品人妻一区二区三区| 日韩免费视频| 中文字幕 亚洲一区| 91精品国产91综合久久蜜臀 | 一本一道久久a久久精品综合蜜臀| 日本免费在线视频不卡一不卡二| 午夜高潮免费视频| 国产在线一在线二| 亚洲综合三区| 一区二区在线观| 欧美日韩在线国产| 精品国产欧美日韩不卡在线观看| 亚洲免费婷婷| av中文网站| 欧美三级日韩三级| 精品久久久久久无| 日韩一级二级三级精品视频| 99久久精品国产成人一区二区| 日韩欧美99| 国产一卡二卡3卡4卡四卡在线| 亚洲大片精品永久免费| 久久久精品日韩欧美| 亚洲热在线观看| 精品久久电影| 国产在线日韩精品| 国产一级视频在线播放| 91麻豆精品国产91久久久使用方法| 国产小视频免费在线网址| 国产小视频在线观看| 日韩中文字幕观看| 亚洲国产无线乱码在线观看| 日韩高清在线一区二区| 91久久精品国产| 色99中文字幕| 91精品观看| 亚州黄色一级| 91精品综合久久久久久| 在线国产91| 日韩一级在线免费观看| 精品亚洲国内自在自线福利| 国产在线中文字幕| 欧美日韩激情一区二区三区| 日韩中文字幕在线播放| 国产午夜精品一区二区三区视频| 日韩国产在线不卡视频| 日韩欧美亚洲国产| 中文字幕成人乱码在线电影| 国产成免费视频| 国产一二三四| 99视频一区| 精品国产欧美| 欧美亚洲国产日韩| 一区二区不卡在线播放| 亚洲一区在线观看免费| 国产在线拍偷自揄拍精品| 91精品在线观看视频| 最近中文字幕第一页| 91麻豆免费视频网站| 91久久中文| 日韩精品在线免费播放| 日韩福利视频导航| 国产欧美日韩视频在线| 久久中文免费视频| 国产三级第一页| 高清一区二区| 亚洲福利在线视频| 99在线精品视频免费观看20| 欧美日韩精品在线 | 日韩你懂的电影在线观看| 日韩精品视频在线观看网址| 亚洲欧美中文字幕在线观看| 精品国产欧美日韩| 亚洲高清视频一区| 国产福利在线播放| 日韩欧美高清在线视频| 国产最新在线| 91精品婷婷国产综合久久竹菊| 中文字幕在线中文字幕二区| 亚洲一区三区在线观看| 国产日韩电影| 一区二区日韩免费看| av中文在线播放| 在线一区二区不卡| 精品久久蜜桃| 欧美日韩在线国产| 久久婷婷国产| 精品人妻一区二区免费视频| 日韩欧美久久久| 又黄又www的网站| 一区二区三区在线免费 | 亚洲永久免费视频| 日韩欧美色综合网站| 欧美日韩中文字幕在线观看| 国产一级网站视频在线| 91精品国产91久久| 日韩欧美在线网站| 在线日韩中文| 亚洲一级网站| 阿v免费在线观看| 欧美日韩中文字幕日韩欧美| 欧美日韩国产首页| 亚洲欧美伊人| 91www成人久久| 中文字幕在线观看网址| 中文字幕精品在线播放| 国产裸体歌舞团一区二区 | 亚洲小说春色综合另类电影| 日本不卡一区在线| 国产日韩在线视频| 午夜私人影院在线观看| 欧美乱大交xxxxx免费| 国产高清大尺度一区二区不卡| 欧美日韩中文字幕精品| 91久久精品国产| 欧美日韩高清在线一区| 中文字幕在线播放一区| 国产xxx在线| 久久精品日韩欧美| 精品无人国产偷自产在线| 久久 天天综合| 精品国产综合久久| 粉嫩喷白浆久久| 久久蜜桃精品| 一区二区中文视频| 久久精品蜜桃| 日韩精品高清不卡| 精品视频999| 欧美日韩高清不卡| 亚洲 欧美 中文字幕| 亚洲一区资源| 欧美日韩在线视频一区| 亚洲一卡二卡在线观看| 精品国产1区2区3区| 久久精品久久精品国产大片| 91精品xxx在线观看| 日韩在线观看a| av中文天堂在线| 欧美日韩精品是欧美日韩精品| 亚洲天堂国产视频| 欧美日韩国产首页在线观看| 日韩欧美国产高清| 国产在线拍揄自揄拍| 久久久精品日韩| 91精品国产高清91久久久久久| 免费视频久久| 国产黄色网页| 久久精品日韩无码| 一本一道综合狠狠老| 日韩欧美国产高清| 欧美99久久| 日本xxxwww免费视频| 日韩免费视频一区二区视频在线观看| 国产在线看一区| 精品视频999| 精品播放一区二区| 亚洲福利视频在线| 日韩欧美中文字幕精品| 国产欧美日韩视频| 欧美一级欧美三级在线观看| 中文字幕 乱码 中文乱码91| 国产精品福利视频一区二区三区| 亚洲高清中文字幕| 欧美日韩国产在线| 欧美三级视频在线| 中文字幕在线看视频国产欧美| 国产一级粉嫩xxxx| 亚洲福利精品| av丝袜在线| 欧美午夜影院在线视频| 日韩国产成人| 久久精品国产2020观看福利| 久久91精品国产91久久小草| 成人福利一区| 欧美另类久久久品| 亚洲成年人在线播放| 国产激情久久| 99久热re在线精彩视频| 国产亚洲福利| 精品久久久久久无| 欧美日韩国产免费| 国产 日韩 欧美 综合| 国产农村妇女精品一二区| 国产一级在线播放| 日韩欧美国产黄色| 久久久精品福利| 99色在线视频| 一本一道综合狠狠老| 亚洲福利精品| 中文字幕日韩亚洲| 日韩欧美在线网址| 午夜私人影院在线观看| 精品日韩视频在线观看| 免费视频二区|