国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

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

歡迎使用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四個步驟來搞。另外上面演示的都是基本要點,其他都是各種形式的變種或高級用法,同時每種框架都有自己的特殊要求,必須遵從。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
91av资源在线| 国产女王在线**视频| 天堂在线国产| 在线免费国产视频| 精品亚洲综合| 蜜桃视频网站在线| xxx国产精品| 青青草中文字幕| 国产精品一区在线看| 国产对白国语对白| 羞羞视频在线观看免费| 日本视频在线| 国产一级黄色电影| 一本免费视频| 国产一级二级在线| 亚洲激情丁香| 国产偷激情在线| а√资源新版在线天堂| 国产视频资源| 欧美国产中文| 91精品专区| 狠狠综合久久久综合| 国产黄色大片在线观看| 欧美性猛交xxxxbbbb| 69日小视频在线观看| 国产麻豆精品视频一区二区 | 92久久精品| 天堂资源中文在线| av网站大全在线观看| 日本中文字幕高清视频| 九九在线免费视频| 99热播在线观看| 国产丝袜在线播放| 国产农村av| 免费午夜一级| 另类专区欧美| 久久久久久五月天久久久久久久久| 国产va在线| 国产二区三区在线| 国产黄色在线| 国产黄色av免费看| 精品视频二区三区| 中文国产字幕在线观看| 91在线网址| 亚洲日本久久久午夜精品| 在线国产小视频| 91在线超碰| 午夜在线观看91| 九九精品视频在线观看九九| 成人欧美亚洲| 国产视频三区| 在线午夜视频| 免费一区二区三区视频狠狠| 久久久久久91精品色婷婷| 国产中文在线| 国产黄在线看| 亚洲欧美久久婷婷爱综合一区天堂| av在线资源网| 国产美女自拍视频| 国产白浆在线| 日本免费不卡| 国产精品天堂| 2021av天天| 国产在线看片| 99在线欧洲视频| 国产精品作爱| 亚洲天堂电影在线观看| 国产在线中文字幕| 国产精品jvid在线观看| 羞羞视频在线免费看| 国产乱子伦三级在线播放| 国产夫妻视频| 国产麻豆高清视频在线第一页 | 国产视频你懂的| 亚洲免费国产| 国产精品视频h| www.香蕉视频在线观看| 国产三区在线观看| www.色婷婷| 国产福利免费观看| 国产一区二区三区福利| 欧美精品久久久久久久小说| 国产区在线观看| 国产嫩草在线视频| 日本亚洲精品| 四虎免费播放| 香蕉视频在线观看网站| 中文视频在线| 国产三级免费观看| 国产免费av网站| 黄色毛片在线看| 久草电影在线| 超碰在线影院| 久久精品国产亚洲777| 人日人天天爽| www.夜夜操| 四虎成人免费| 日本三级在线视频| www在线视频观看| www.91在线播放| 女人色在线免费视频| www在线免费观看视频| а√最新版地址在线天堂| 国产不卡精品一区二区三区| 国产农村一级特黄α**毛片| 久久精品视频免费看| xxxxx中文字幕| xxx国产精品| 黄色国产在线| 国产激情自拍视频| av丝袜在线| 国内精品一区视频| 国产天堂在线播放视频| 91社区在线观看| 日本成人免费网站| 丁香花高清视频完整版在线观看| 99热在线观看免费| 国产视频三区| 永久免费av网站| 欧美成人亚洲高清在线观看| 国产麻豆精品视频一区二区| 国产一级免费在线观看| 精品无人乱码| 国产麻豆麻豆| h视频在线网站| 国产一级性片| 欧美日韩国产亚洲沙发| 国产色视频网站| 超碰97国产精品人人cao| 天堂在线看视频| av在线1区2区| 国产一卡2卡3卡免费网站| 97视频免费| 激情四房婷婷| 影音先锋中文字幕在线| 国产桃色电影在线播放| www.操操| 在线播放一区二区精品产| 国产免费福利| jizz在线免费观看| 国产二级片在线| 99热在线免费观看| 欧美亚洲另类在线观看| 在线免费观看黄色av| 国产天堂av| 国产一起色一起爱| 国产在线日本| 黄色网页网址在线免费| av在线1区2区| 国产aa视频| 国产porn在线| 91精选福利| 9999在线视频| 国产黄色在线观看| 国产午夜在线视频| 国产亚洲精品久久久久久青梅 | eeuss影院网站免费观看| 国产黄视频网站| 激情小说 在线视频| www.国产精| 亚洲午夜久久久久中文字幕| av大片在线播放| 在线中文字幕第一页| 国产福利视频在线观看| 国产95在线|亚洲| 国产成人福利| 精品一区二区91| 在线影视一区| 夜夜爽视频导航| 日本18视频网站| 欧美精品久久久久久久小说| 快射av在线播放一区| 国产专区在线播放| 成人超碰在线| 国产精品免费91| 91在线高清| 欧美精品久久久久久久小说| 麻豆国产在线播放| 国产在线www| 国产精品乱码一区二区三区视频| 91黄色在线| 国产在线你懂得| 97影院秋霞午夜在线观看| а√最新版地址在线天堂| 国产中文第一页| 在线亚洲不卡| 中文字幕乱在线伦视频乱在线伦视频| 最近中文字幕mv免费高清视频8| 国产无遮挡在线视频免费观看| 国产激情小视频在线| 日本福利在线| 2020国产在线视频| 国产麻豆精品视频一区二区| 国产黄大片在线观看画质优化| 在线免费观看黄色av| 国产免费视频| 日本成人a视频| 在线中文av| 国产福利电影在线| 国产精品一区二区婷婷|