日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Mockito 的使用

發(fā)布時間:2023/12/2 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mockito 的使用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)自:Mockito 中文文檔 ( 2.0.26 beta )

轉(zhuǎn)自:手把手教你 Mockito 的使用

參數(shù)匹配器

Argument Matcher(參數(shù)匹配器)

Mockito通過equals()方法,來對方法參數(shù)進行驗證。但是有時候我們需要更加靈活的參數(shù)需求,比如,匹配任何的String類型的參數(shù)等等。參數(shù)匹配器就是一個能夠滿足這些需求的工具。 Mockito框架中的Matchers類內(nèi)建了很多參數(shù)匹配器,我們常用的Mockito對象就是繼承自Matchers。比如anyInt()匹配任何int類型的參數(shù),anyString()匹配任何字符串... @Test public void argumentMatchersTest(){ List<String> mock = mock(List.class); when(mock.get(anyInt())).thenReturn("Hello").thenReturn("World"); String result=mock.get(100)+" "+mock.get(200); verify(mock,times(2)).get(anyInt()); assertEquals("Hello World",result); } 首先mock了List接口,然后用迭代的方式模擬了get方法的返回值,這里用了anyInt()參數(shù)匹配器來匹配任何的int類型的參數(shù)。所以當?shù)谝淮握{(diào)用get方法時輸入任意參數(shù)為100方法返回”Hello”,第二次調(diào)用時輸入任意參數(shù)200返回值”World”。 這里需要注意: 如果使用了參數(shù)匹配器,那么所有的參數(shù)需要由匹配器來提供,否則將會報錯。假如我們使用參數(shù)匹配器stubbing了mock對象的方法,那么在verify的時候也需要使用它。如: @Test public void argumentMatchersTest(){ Map mapMock = mock(Map.class); when(mapMock.put(anyInt(), anyString())).thenReturn("world"); mapMock.put(1, "hello"); verify(mapMock).put(anyInt(), eq("hello")); }

在最后的驗證時如果只輸入字符串”hello”是會報錯的,必須使用Matchers類內(nèi)建的eq方法。如果將anyInt()換成1進行驗證也需要用eq(1)。

自定義匹配器-ArgumentMatcher抽象類

自定義參數(shù)匹配器的時候需要繼承ArgumentMatcher抽象類,它實現(xiàn)了Hamcrest框架的Matcher接口,定義了describeTo方法,所以我們只需要實現(xiàn)matches方法在其中定義規(guī)則即可。
下面自定義的參數(shù)匹配器是匹配size大小為2的List:

1 class IsListOfTwoElements extends ArgumentMatcher<List> { 2 @ 3 public boolean matches(Object list) { 4 return ((List) list).size() == 2; 5 } 6 } 7 8 @Test 9 public void argumentMatchersTest(){ 10 List mock = mock(List.class); 11 when(mock.addAll(argThat(new IsListOfTwoElements()))).thenReturn(true); 12 13 mock.addAll(Arrays.asList("one", "two", "three")); 14 verify(mock).addAll(argThat(new IsListOfTwoElements())); 15 }

argThat(Matcher<T> matcher)方法用來應用自定義的規(guī)則,可以傳入任何實現(xiàn)Matcher接口的實現(xiàn)類。上例中在stubbing和verify addAll方法時通過argThat(Matcher<T> matcher),傳入了自定義的參數(shù)匹配器IsListOfTwoElements用來匹配size大小為2的List。因為例子中傳入List的元素為三個,所以測試將失敗。

較復雜的參數(shù)匹配將會降低測試代碼的可讀性。有時實現(xiàn)參數(shù)對象的equals()方法是個不錯的選擇(Mockito默認使用equals()方法進行參數(shù)匹配),它可以使測試代碼更為整潔。另外,有些場景使用參數(shù)捕獲器(ArgumentCaptor)要比自定義參數(shù)匹配器更加合適。?

?

如何捕獲 mock 方法的調(diào)用參數(shù)

Mockito以java代碼風格的形式來驗證參數(shù)值 : 即通過使用equals()函數(shù)。這也是我們推薦用于參數(shù)匹配的方式,因為這樣會使得測試代碼更簡單、簡潔。在某些情況下,當驗證交互之后要檢測真實的參數(shù)值時這將變得有用。例如 :

1 @Test 2 public void captureNonGenericArgument() { 3 UserDao userDao = Mockito.mock(UserDao.class); 4 UserService userService = new UserService(userDao); 5 6 userService.saveUser(new User(null, "Yanbin")); 7 8 ArgumentCaptor<User> argumentCaptor = ArgumentCaptor.forClass(User.class); 9 verify(userDao, times(1)).save(argumentCaptor.capture()); 10 11 assertEquals("Yanbin", argumentCaptor.getValue().name); 12 assertEquals("Chicago", argumentCator.getValue().city); //可斷言捕獲參數(shù)的更多特征

從面對被捕獲參數(shù)?argumentCaptor.getValue()?的斷言可看出它比?argThat()?的優(yōu)勢,argThat() 無法告訴我們不匹配的細節(jié)

警告 : 我們建議使用沒有測試樁的ArgumentCaptor來驗證,因為使用含有測試樁的ArgumentCaptor會降低測試代碼的可讀性,因為captor是在斷言代碼塊之外創(chuàng)建的。另一個好處是它可以降低本地化的缺點,因為如果測試樁函數(shù)沒有被調(diào)用,那么參數(shù)就不會被捕獲。總之,ArgumentCaptor與自定義的參數(shù)匹配器相關(可以查看ArgumentMatcher類的文檔?)。這兩種技術都能用于檢測外部傳遞到Mock對象的參數(shù)。然而,使用ArgumentCaptor在以下的情況下更合適 :

  • 自定義不能被重用的參數(shù)匹配器
  • 你僅需要斷言參數(shù)值

我們同樣可以在打樁的時候捕獲參數(shù),如

1 ArgumentCaptor<User> argumentCaptor = argumentCaptor.forClass(User.class); 2 when(userDao.findUserLike(argumentCaptor.capture)).thenReturn(Mockito.mock(User.class)); 3 4 assertEquals("Yanbin", argumentCaptor.getValue().name);

?不能以這種方式在打樁的時候捕獲參數(shù):

1 when(userDao.findUserLike(argumentCaptor.capture)).thenReturn(getUser(argumentCaptor.getValue()));

否則會報錯:

出錯位置在打樁的地方。記住打樁并不等于異步調(diào)用,它返回的是個固定值!

轉(zhuǎn)載于:https://www.cnblogs.com/fnlingnzb-learner/p/10595138.html

總結

以上是生活随笔為你收集整理的Mockito 的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。