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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

使用Mockito进行Java单元测试

發(fā)布時間:2025/3/21 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Mockito进行Java单元测试 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Google在3月份推出了一個關(guān)于Android MVP架構(gòu)的官方Sample,除MVP架構(gòu)本身之外,在這個Sample中配備了完善的單元測試用例,這對學(xué)習(xí)如何在Android中進行單元測試具有極高的價值。這篇文章主要是對其中使用的Mock框架-Mockito的學(xué)習(xí)總結(jié)。

什么是Mock?

Mock是虛擬對象,是為了模擬真實對象而創(chuàng)建的,這些虛擬對象的行為是可控的。為方便理解,可以把Mock視為『汽車碰撞實驗』中的『假人』。


真實軟件架構(gòu)
測試軟件架構(gòu)

為什么需要Mock?

  • 真實軟件架構(gòu)中的對象行為是不確定的(eg:時間、對象的狀態(tài))

  • 真實對象的一些狀態(tài)又很難構(gòu)造(eg:網(wǎng)絡(luò)抖動)

  • 真實對象在進行某種操作時需要很長時間,影響測試進度(eg:一些數(shù)據(jù)庫的初始化)

  • TDD(測試驅(qū)動開發(fā))要求先寫測試代碼,再進行開發(fā),那么經(jīng)常會出現(xiàn)真實對象還沒有開發(fā)完成的現(xiàn)象,又或者真實對象是一個硬件,只能模擬

  • 實際測試中需要關(guān)注真實對象如何被調(diào)用,真實對象內(nèi)部狀態(tài)如何

  • 上述的問題都是可以通過引入Mock來解決的。

    什么是Mockito?

    Mockito是用于Java單元測試的一個Mock框架。

    為什么選擇Mockito?

  • Mockito是StackOverflow社區(qū)票選的最佳Java Mock框架

  • Github 中位于Top4的Library

  • 3.使用簡潔、優(yōu)雅的API即可寫出漂亮的單元測試用例,這些單元測試語法符合自然語言,方便閱讀

    Android Studio中如何配置使用Mockito?

    android studio默認的構(gòu)建工具是gradle,只需要在對應(yīng)的build.grade中添加Mockito依賴即可。

    repositories { jcenter() }dependencies { testCompile "org.mockito:mockito-core:1.+" }

    Mockito可以完成哪些功能?

  • 驗證Mock對象某函數(shù)是否執(zhí)行,執(zhí)行次數(shù)
  • Mock對象某函數(shù)有返回值,可以設(shè)置返回值。對于void的函數(shù),可以設(shè)置拋出異常(即常說的安裝樁)
  • 驗證Mock對象函數(shù)執(zhí)行順序
  • 參數(shù)匹配(有很多內(nèi)建的參數(shù),也可以自己實現(xiàn)),這樣使得驗證函數(shù)交互或者設(shè)置返回值更加靈活
  • 可以捕獲參數(shù)用于后續(xù)進一步驗證或設(shè)置
  • Mockito常用API及使用方法

  • 創(chuàng)建Mock對象-創(chuàng)建Mock對象有兩種方法
    • 使用mock函數(shù) - public static <T> T mock(Class<T> classToMock)
    • 使用@Mock注釋 - 但必須在@Test函數(shù)中初始化或使用內(nèi)建的Junit Runner
  • 驗證Mock對象函數(shù)是否執(zhí)行、執(zhí)行次數(shù) - public static <T> T verify(T mock,VerificationMode mode),其中mode可以為times(x), atLeastOnce() 或者 never()
    verify(mock, times(5)).someMethod("was called five times");
    verify(mock, atLeast(2)).someMethod("was called at least two times");
    verify(mock, atLeastOnce()).someMethod(anyString());
  • 給模擬對象的有返回值的函數(shù)安裝樁 -
    when(methodCall).thenReturn() 或 when(methodCall).thenThrow()
  • 給模擬對象返回void的函數(shù)安裝樁 -
    doThrow(new RuntimeException()).when(mockObject).methodCall();
  • 參數(shù)匹配-Mockito默認使用java的equals判斷函數(shù)參數(shù)值,但有時為了更加靈活,可以使用參數(shù)匹配功能
    when(mockedObject.methodCall(anyInt())).thenReturn("element")when(mockedObject.contains(argThat(isValid())).thenReturn("element");//isValid()是自定義的參數(shù)匹配
  • 驗證模擬對象函數(shù)執(zhí)行順序
    personDAL.add(any());personDAL.getAll();InOrder inOrder = inOrder(personDAL);inOrder.verify(personDAL).add(any());inOrder.verify(personDAL).getAll();
  • 捕獲模擬對象函數(shù)參數(shù),進一步驗證捕獲的參數(shù)
    ArgumentCaptor<Person> argument = ArgumentCaptor.forClass(Person.class);verify(mock).doSomething(argument.capture());assertEquals("John", argument.getValue().getName());
  • 關(guān)于Mockito會繼續(xù)根據(jù)實際項目進一步整理實踐知識。



    文/桃子媽咪(簡書作者)
    原文鏈接:http://www.jianshu.com/p/3d6f76df21f9
    著作權(quán)歸作者所有,轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),并標注“簡書作者”。

    總結(jié)

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

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