Mockito Framework用法簡介

編程過程可以抽象為expect-run-verify苛预,而在Java中我們常用單元測試來保證程序運行結果符合我們的預期。

Mockito可以實現(xiàn):

  • 在得到程序輸出結果后沥邻,驗證結果是否符合預期罩润;
  • 在其依賴方法還沒有編寫完成時,mock接口的執(zhí)行結果铅辞。

mock

  • 通過when(...).then(...)指定具體行為動作的mock結果厌漂;
  • 可通過如下方式自定義響應:
 when(mock.someMethod(anyString())).thenAnswer(
     new Answer() {
         public Object answer(InvocationOnMock invocation) {
             Object[] args = invocation.getArguments();
             Object mock = invocation.getMock();
             return "called with arguments: " + Arrays.toString(args);
         }
 });

 //Following prints "called with arguments: [foo]"
 System.out.println(mock.someMethod("foo"));
import static org.mockito.Mockito.*;

// 通過mock方法創(chuàng)建一個mock類,該實例的所有調用返回的都是mock值
List mockedList = mock(List.class);

// 使用mock實例斟珊,不會拋出任何非檢查型異常
mockedList.add("one");
mockedList.clear();

// 驗證某方法是否執(zhí)行過
verify(mockedList).add("one");
verify(mockedList).clear();

//定義一個stub存根苇倡,mock方法執(zhí)行返回結果
when(mockedList.get(0)).thenReturn("first");

// 命中stub,符合上面定義的mock條件囤踩,返回mock結果
System.out.println(mockedList.get(0));

// 因為get(999)未命中stub旨椒,故返回null
System.out.println(mockedList.get(999));

測試輸出結果如下:

mock測試結果

@mock

public class ArticleManagerTest extends SampleBaseTestCase {

       @Mock private ArticleCalculator calculator;
       @Mock(name = "database") private ArticleDatabase dbMock;
       @Mock(answer = RETURNS_MOCKS) private UserProvider userProvider;
       @Mock(extraInterfaces = {Queue.class, Observer.class}) private  articleMonitor;

       private ArticleManager manager;

       @Before public void setup() {
           manager = new ArticleManager(userProvider, database, calculator, articleMonitor);
       }
   }

   public class SampleBaseTestCase {

       @Before public void initMocks() {
            //MockitoAnnotations.initMocks(this)必須在test執(zhí)行前調用
           MockitoAnnotations.initMocks(this);
       }
   }

spy

  • mock代理部分指定的方法,其余方法都執(zhí)行真實的方法動作堵漱。
List list = new LinkedList();
List spy = spy(list);

//可以選擇性stub部分方法综慎,其余未被代理的方法會真實執(zhí)行
when(spy.size()).thenReturn(100);

//真實調用執(zhí)行
spy.add("one");
spy.add("two");

//打印第一個元素
System.out.println(spy.get(0));

//size() 方法被mock代理了,返回設定值:100
System.out.println(spy.size());

//驗證
verify(spy).add("one");
verify(spy).add("two");

測試輸出結果如下:


spy測試結果

@spy

public class Test{
   //Instance for spying is created by calling constructor explicitly:
   @Spy Foo spyOnFoo = new Foo("argument");
   //Instance for spying is created by mockito via reflection (only default constructors supported):
   @Spy Bar spyOnBar;
   @Before
   public void init(){
      MockitoAnnotations.initMocks(this);
   }
   ...
}

/****************等同于*********/
Foo spyOnFoo = Mockito.spy(new Foo("argument"));
Bar spyOnBar = Mockito.spy(new Bar());

verify

  • 驗證執(zhí)行方法是否被調用執(zhí)行指定的次數(shù)
List<String> mockedList = mock(List.class);
//using mock
 mockedList.add("once");

 mockedList.add("twice");
 mockedList.add("twice");

 mockedList.add("three times");
 mockedList.add("three times");
 mockedList.add("three times");

 //following two verifications work exactly the same - times(1) is used by default
 verify(mockedList).add("once");
 verify(mockedList, times(1)).add("once");

 //exact number of invocations verification
 verify(mockedList, times(2)).add("twice");
 verify(mockedList, times(3)).add("three times");

 //verification using never(). never() is an alias to times(0)
 verify(mockedList, never()).add("never happened");

 //verification using atLeast()/atMost()
 verify(mockedList, atLeastOnce()).add("three times");
 verify(mockedList, atLeast(2)).add("three times");
 verify(mockedList, atMost(5)).add("three times");

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勤庐,一起剝皮案震驚了整個濱河市示惊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愉镰,老刑警劉巖米罚,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丈探,居然都是意外死亡录择,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門碗降,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘竭,“玉大人,你說我怎么就攤上這事讼渊《矗” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵爪幻,是天一觀的道長弧圆。 經(jīng)常有香客問我赋兵,道長,這世上最難降的妖魔是什么搔预? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任霹期,我火速辦了婚禮,結果婚禮上拯田,老公的妹妹穿的比我還像新娘历造。我一直安慰自己,他們只是感情好船庇,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布吭产。 她就那樣靜靜地躺著,像睡著了一般鸭轮。 火紅的嫁衣襯著肌膚如雪臣淤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天窃爷,我揣著相機與錄音邑蒋,去河邊找鬼。 笑死按厘,一個胖子當著我的面吹牛医吊,可吹牛的內容都是我干的。 我是一名探鬼主播逮京,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼卿堂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了懒棉?” 一聲冷哼從身側響起草描,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎策严,沒想到半個月后穗慕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡享钞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年揍诽,在試婚紗的時候發(fā)現(xiàn)自己被綠了诀蓉。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片栗竖。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖渠啤,靈堂內的尸體忽然破棺而出狐肢,到底是詐尸還是另有隱情,我是刑警寧澤沥曹,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布份名,位于F島的核電站碟联,受9級特大地震影響,放射性物質發(fā)生泄漏僵腺。R本人自食惡果不足惜鲤孵,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辰如。 院中可真熱鬧普监,春花似錦、人聲如沸琉兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌蟋。三九已至廊散,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梧疲,已是汗流浹背允睹。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留往声,地道東北人擂找。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像浩销,于是被迫代替她去往敵國和親贯涎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容

  • 幾點說明:代碼中的 //<== 表示跟上面的相比慢洋,這是新增的塘雳,或者是修改的代碼,不知道怎么樣在代碼塊里面再強調幾行...
    鄒小創(chuàng)閱讀 14,014評論 15 41
  • 在博客Android單元測試之JUnit4中普筹,我們簡單地介紹了:什么是單元測試败明,為什么要用單元測試,并展示了一個簡...
    水木飛雪閱讀 9,480評論 4 18
  • 什么是 Mock mock 的中文譯為: 仿制的太防,模擬的妻顶,虛假的。對于測試框架來說蜒车,即構造出一個模擬/虛假的對象讳嘱,...
    Whyn閱讀 4,357評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)酿愧,斷路器沥潭,智...
    卡卡羅2017閱讀 134,715評論 18 139
  • 什么是單元測試 在計算機編程中,單元測試(Unit Testing)又稱為模塊測試, 是針對程序模塊(軟件設計的最...
    HelloCsl閱讀 10,961評論 1 46