Mokito的一些API

Mockito是一個Java單元測試框架,它允許開發者創建和配置模擬對象(mock objects),以便在隔離的環境中測試代碼,尤其是當實際對象難以構造或其行為不確定時。下面是一些核心的Mockito API及其使用場景和代碼示例。

基礎API

  1. 創建Mock對象

    • @Mock 注解或 Mockito.mock(Class<T> classToMock) 方法用于創建mock對象。

    場景: 當你需要模擬一個類的行為,以便測試依賴于它的類或方法時。

    示例:

    @Mock
    List<String> mockedList;// 或者
    List<String> mockedList = Mockito.mock(List.class);
    
  2. 定義Mock行為

    • Mockito.when(mockedMethodCall).thenReturn(value) 定義當特定方法被調用時應返回的值。

    場景: 你想要控制模擬對象在特定調用下的響應。

    示例:

    Mockito.when(mockedList.get(0)).thenReturn("first");
    
  3. 驗證交互

    • Mockito.verify(mockedObject).methodCall(arguments) 驗證某個方法是否按照預期被調用了。

    場景: 驗證測試過程中mock對象的某個方法確實被正確調用。

    示例:

    mockedList.add("one");
    Mockito.verify(mockedList).add("one");
    
  4. 捕獲參數

    • 使用 ArgumentCaptor 捕獲傳遞給mock方法的參數,以便進一步檢查。

    場景: 需要檢查方法調用的具體參數時。

    示例:

    ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class);
    Mockito.verify(mockedList).add(argument.capture());
    assertEquals("captured", argument.getValue());
    
  5. 設置異常

    • Mockito.when(mockedMethodCall).thenThrow(exception) 用于模擬方法拋出異常。

    場景: 測試代碼對異常的處理邏輯。

    示例:

    Mockito.when(mockedList.get(999)).thenThrow(new IndexOutOfBoundsException());
    

具體使用場景示例

假設你有一個UserService類,它依賴于UserRepository來獲取用戶信息。你想測試UserServicegetUserById方法,但不希望真實地查詢數據庫。

public class UserService {private UserRepository userRepository;public UserService(UserRepository userRepository) {this.userRepository = userRepository;}public User getUserById(int id) {return userRepository.findById(id);}
}public interface UserRepository {User findById(int id);
}

測試類使用Mockito模擬UserRepository

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;class UserServiceTest {@MockUserRepository userRepository;private UserService userService;@BeforeEachvoid setUp() {userService = new UserService(userRepository);}@Testvoid getUserById_ReturnsUser() {// 創建模擬行為User mockUser = new User(1, "John Doe");when(userRepository.findById(1)).thenReturn(mockUser);// 調用待測試方法User result = userService.getUserById(1);// 驗證結果assertEquals(mockUser, result);// 驗證交互Mockito.verify(userRepository).findById(1);}
}

在這個例子中,UserRepository被模擬,其findById方法被設定為返回一個預設的User對象,從而允許我們專注于測試UserService的邏輯,而不必關心數據庫操作的細節。

當然,除了基本的Mock對象之外,Mockito還提供了Spy功能,以及其他一些高級特性,以滿足更復雜的測試需求。下面我將繼續介紹這些內容。

Spy

Spy與Mock相似,但它會委托真實對象執行未被模擬的方法調用,只有被明確指定的方法才會被模擬。這在你需要大部分保留原有對象行為,僅修改或監控部分行為時非常有用。

API:

  • Mockito.spy(Object object) 創建一個Spy對象。

場景: 當你希望大部分情況下使用真實對象的行為,只在某些特定方法上進行模擬或驗證時。

示例:

public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}@Test
void testSpy() {Calculator realCalculator = new Calculator();Calculator spyCalculator = Mockito.spy(realCalculator);// 模擬add方法的行為when(spyCalculator.add(1, 1)).thenReturn(3);// 調用真實subtract方法int result = spyCalculator.subtract(5, 2);// 驗證add方法的模擬行為assertEquals(3, spyCalculator.add(1, 1));// 驗證subtract方法的調用及結果assertEquals(3, result);verify(spyCalculator).subtract(5, 2);
}

其他高級API

  1. DoAnswer: 提供更靈活的方式來定義模擬方法的行為,可以基于回調函數執行自定義邏輯。

    示例:

    doAnswer(invocation -> {Object[] args = invocation.getArguments();return args[0] + args[1];
    }).when(someMock).someMethod(anyInt(), anyInt());
    
  2. BDD風格: Mockito提供了一套行為驅動開發(Behavior-Driven Development)風格的API,使得測試代碼更加可讀。

    示例:

    given(mockedList.get(0)).willReturn("first");
    then(mockedList).should().add("one");
    
  3. MockitoJUnitRunner: 使用這個Runner可以自動初始化使用@Mock@Spy注解的字段,無需在每個測試方法中手動初始化。

    示例:

    @RunWith(MockitoJUnitRunner.class)
    public class MyTestClass {@MockList<String> mockedList;// 測試方法...
    }
    
  4. MockitoAnnotations.openMocks(this): 如果不使用MockitoJUnitRunner,可以在測試類的setUp方法中手動打開Mockito注解。

    示例:

    @BeforeEach
    public void setUp() {MockitoAnnotations.openMocks(this);
    }
    

通過結合使用這些API,Mockito能夠幫助開發者編寫更加高效、精確的單元測試,確保代碼質量。

使用說明

具體使用說明和示例,你可以參考以下資源:

  • 官方文檔: 訪問Mockito官方網站,查看最新的官方文檔,包括API參考和用戶指南。
  • 在線教程: 網站如Stack Overflow上有大量關于Mockito使用的問答,涵蓋了從基礎到高級的各個方面。
  • 技術博客: CSDN、博客園等技術社區有大量Mockito的教程和實踐分享,比如通過搜索“Mockito進階使用”、“Mockito詳盡教程”等關鍵詞。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/14635.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14635.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/14635.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

wordpress教程視頻 wordpress教程網盤 wordpress教程推薦wordpress教程網

WordPress&#xff0c;作為一款強大且靈活的開源內容管理系統&#xff0c;已成為許多網站開發者與運營者的首選。其強大的功能、豐富的插件以及易于上手的特點&#xff0c;使得無論是初學者還是專業開發者都能輕松構建出個性化的網站。然而&#xff0c;對于初學者來說&#xff…

JUnit5標記測試用例

使用場景&#xff1a; 通過Tag對用例分組&#xff1a; 環境分組&#xff1a;測試環境、預發布環境階段分組&#xff1a;冒煙用例版本分組&#xff1a;V1.1、V1.2 Tag標記用例&#xff1a; 設置標簽根據標簽執行 結合Maven執行結合測試套件執行 設置標簽&#xff1a; 通過T…

NER 數據集格式轉換

NER 數據集格式 格式一 某些地方的數據和標簽拆成兩個文件了 sentences.txt 如 何 解 決 足 球 界 長 期 存 在 的 諸 多 矛 盾 &#xff0c; 重 振 昔 日 津 門 足 球 的 雄 風 &#xff0c; 成 為 天 津 足 壇 上 下 內 外 到 處 議 論 的 話 題 。 該 縣 一 手 抓 農 業…

【Spring Cloud】全面解析服務容錯中間件 Sentinel 持久化兩種模式

文章目錄 推送模式本地文件持久化&#xff08;拉模式&#xff09;配置yml編寫處理類添加配置演示 配置中心持久化&#xff08;推模式&#xff09;修改nacos在sentinel中生效引入依賴配置文件 修改sentinel在nacos中生效下載源碼更改代碼演示 總結 推送模式 Sentinel 規則的推送…

allegro 無法刪除Xnet

allegro 無法刪除Xnet Orcad中打開Constraint Manager之后&#xff0c;再生成網表&#xff0c;導入PCB后就會出現一堆Xnet網絡。無法去除Xnet。 解決辦法 在原理圖ORCAD中&#xff0c; 1、打開Edit Object properties 2、選擇Filter by:Capture 3、點擊New Property 4、設置…

火山引擎邊緣云亮相 Force 原動力大會,探索 AI 應用新范式

5月15日&#xff0c;2024 春季火山引擎 FORCE 原動力大會在北京正式舉辦。大會聚焦 AI 主題&#xff0c;以大模型應用為核心、以 AI 落地為導向&#xff0c;展示了火山引擎在大模型、云計算領域的實踐應用&#xff0c;攜手汽車、手機終端、金融、消費、互聯網等領域的專家和企業…

2024042102-array-list

數組 Array 一、前言 數組是數據結構還是數據類型&#xff1f; 數組只是個名稱&#xff0c;它可以描述一組操作&#xff0c;也可以命名這組操作。數組的數據操作&#xff0c;是通過 idx->val 的方式來處理。它不是具體要求內存上要存儲著連續的數據才叫數據&#xff0c;而…

js積累三(web頁面一段時間未操作,退出登錄)

//核心代碼&#xff0c;已封裝function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds&#xff0c;可自行修改時長var time_time maxTime;/* 鼠標點擊事件 */$(document).mousedown(function(){time_time maxTime; //…

Spring Aop對本地事務的影響

1.Transactional聲明式事物也是基于aop實現的&#xff0c;public方法加了Transactional注解后&#xff0c;已經成功的創建了事務&#xff0c;但是當前方法仍在方法攔截器中 2.業務方法發生異常之后的處理 判斷回滾條件&#xff1a; 如果自定義了RollbackRuleAttribute列表&am…

EI會議的最佳論文獎是什么?如何申請?

EI會議的最佳論文獎通常是指在EI&#xff08;工程索引&#xff0c;Engineering Index&#xff09;收錄的學術會議中&#xff0c;評選出的表現最優秀的論文獎項。以下是關于該獎項的一些基本信息及申請步驟&#xff1a; 最佳論文獎的含義 評選標準&#xff1a;最佳論文獎通常基…

多線程、進程、線程五種狀態、synchronized、volatile、Lock、CAS、死鎖、ThreadLocal

1、并發編程 并發編程三要素 原子性&#xff1a;只一個操作要么全部成功&#xff0c;要么全部失敗可見性&#xff1a;一個線程對共享變量的修改&#xff0c;其他線程能夠立刻看到有序性&#xff1a;程序執行的順序按照代碼的先后順序執行 synchronized&#xff0c;Lock解決原…

前端vue 動態加載ts文件,動態調用ts內的方法

業務場景: 在某個業務場景中, 我們需要在數據庫配置ts文件路徑,和需要調用的函數名稱, 前端需要再指定的場景下,觸發對應的函數, 并執行處理邏輯,返回結果. 實現: 這是一個數據庫配置生成的動態表單 動態校驗的例子, 需要引用動態的函數校驗 任意一個js文件, common1.ts c…

大模型日報|今日必讀的 13 篇大模型論文

大家好&#xff0c;今日必讀的大模型論文來啦&#xff01; 1.MIT新研究&#xff1a;并非所有語言模型特征都是線性的 最近的研究提出了線性表征假說&#xff1a;語言模型通過操作激活空間中概念&#xff08;“特征”&#xff09;的一維表征來執行計算。與此相反&#xff0c;來…

CHI dataless 傳輸——CHI(4)

上篇介紹了read的操作類型&#xff0c;本篇我們來介紹一下dataless 目錄 一、dataless操作概覽 二、Non-CMO (Non-Cache Maintenance Operation) 1、CleanUnique 2、StashOnce and StashOnceSep 3、Evict 三、CMO (Cache Maintenance Operation) 一、dataless操作概覽 名…

C# 中的 Dictionary<TKey, TValue> 類

Dictionary<TKey, TValue> 是 C# 中的一個泛型集合類,它提供了一種鍵值對的存儲結構,可以用來存儲和快速訪問數據。它的主要特點如下: 鍵值對結構: Dictionary 中的每個元素都是一個鍵值對,鍵必須是唯一的,值可以重復。 快速訪問: Dictionary 基于哈希表實現,可以提供 O…

大白話聊聊MySQL查詢之五子句(知識簡單但重要)

前言&#xff1a; 在日常開發中&#xff0c;查詢數據占很大的比重&#xff0c;在使用 MySQL 數據庫進行查詢時&#xff0c;我們經常需要通過各種條件和規則來篩選和排序數據。要實現這些功能&#xff0c;就不得不使用以下這些子句&#xff1a;WHERE、ORDER BY、GROUP BY、HAVI…

物聯網層次架構設計

物聯網可以分為三個層次&#xff0c;底層是用來感知數據的感知層&#xff0c;即利用傳感器、二維碼、RFID等設備隨時隨地獲取物體的信息。第二層是數據傳輸處理的網絡層&#xff0c;即通過各種傳感網絡與互聯網的融合&#xff0c;將對象當前的信息實時準確地傳遞出去。第三層則…

忍の摸頭之術游戲娛樂源碼

本資源提供給大家學習及參考研究借鑒美工之用&#xff0c;請勿用于商業和非法用途&#xff0c;無任何技術支持&#xff01; 忍の摸頭之術游戲娛樂源碼&#xff0c;抖音上面非常火的摸頭殺畫面,看得我眼花繚亂,源碼拿去玩吧&#xff1b; 目錄說明 忍の摸頭之術&#xff1a;域…

輕松同步:將照片從三星手機傳輸到iPad的簡便方法

概括 想要在新 iPad 上查看三星照片嗎&#xff1f;但是&#xff0c;如果您不知道如何將照片從三星手機傳輸到 iPad&#xff0c;則無法在 iPad 上查看圖片。為此&#xff0c;本文分享了 7 個有用的方法&#xff0c;以便您可以使用它們在不同操作系統之間輕松發送照片。現在&…

EfficientSAM分割對象后求其中圖像中的高

1 分割對象 EfficientSAM https://github.com/yformer/EfficientSAM 2 計算在圖像中最高點即y值最小點 import os import cv2def read_images(folder_path):image_files [f for f in os.listdir(folder_path) iff.endswith(".jpg") or f.endswith(".png&quo…