單元測試:參數匹配器和參數捕捉器

目錄標題

  • 第一章、參數匹配器
    • 1.1)參數匹配器列表
    • 1.2)參數匹配器示例
        • ①anyInt()
        • ②any(Class<> type)
        • ③eq()
        • ④same(expectedObject)
        • ⑤endsWith()
  • 第二章、參數捕捉器
    • 2.1)@Captor
    • 2.2)ArgumentCaptor類

第一章、參數匹配器

1.1)參數匹配器列表

Mockito框架中的參數匹配器是用于在測試中進行靈活驗證和存根設置的工具。如果使用了參數匹配器,方法中的所有參數都必須是匹配器。

verify(mockClass).someMethod(anyInt(), anyString(), eq("third argument"));

參數匹配器列表:

參數匹配器解釋說明
any()參數為任意類型
anyXxx()包括anyInt、anyBoolean、anyByte、anyChar、anyFloat、Double、anyString、anyList、anyIterable等等
any(Class<T> type)任意指定的Class類型,除了null
isA(Class<T> type)指定類型的實現對象
eq(value)參數匹配指定的值
same(expectedObject)參數和給定的值是同一個對象
isNull()參數是null值
notNull()參數非null
nullable(Class clazz)null 或者給定的類型
contains(String substring)參數包含指定的字符串
matches(String regex)匹配正則表達式
endsWith(String suffix)以xx結尾
startsWith(String prefix)以xx開頭
argThat(ArgumentMatcher matcher)自定義匹配器
times()匹配精確的次數

1.2)參數匹配器示例

①anyInt()

示例:使用anyInt()方法來指定參數的范圍,從而實現了對mockList.get()方法的靈活驗證和存根設置。

import static org.mockito.Mockito.*;
import static org.junit.Assert.*;
import org.junit.Test;
import java.util.List;public class TestList {@Testpublic void testList_Argument_Matchers() {List<String> mockList = mock(List.class);when(mockList.get(anyInt())).thenReturn("Mockito");assertEquals("Mockito", mockList.get(0));assertEquals("Mockito", mockList.get(1));assertEquals("Mockito", mockList.get(2));}
}
②any(Class<> type)

示例:使用參數匹配器any(Class type)來存根方法

import static org.mockito.Mockito.*;public class Example {public void testMethod() {// 創建一個mock對象MyClass myClass = mock(MyClass.class);// 使用參數匹配器any(Class<T> type)來存根方法when(myClass.method(any(String.class))).thenReturn("mocked");// 調用被存根的方法String result = myClass.method("input");// 驗證方法是否按預期調用verify(myClass).method(any(String.class));}
}
③eq()

示例:使用參數匹配器eq(value)來存根方法

import static org.mockito.Mockito.*;public class Example {public void testMethod() {// 創建一個mock對象MyClass myClass = mock(MyClass.class);// 使用參數匹配器eq(value)來存根方法when(myClass.method(eq("input"))).thenReturn("mocked");// 調用被存根的方法String result = myClass.method("input");// 驗證方法是否按預期調用verify(myClass).method(eq("input"));}
}
④same(expectedObject)
import org.junit.Test;
import static org.mockito.Mockito.*;public class ExampleTest {@Testpublic void testWithSameMatcher() {// 創建mock對象MyClass myClass = mock(MyClass.class);// 創建預期參數對象Object expectedObject = new Object();// 設置預期行為,使用參數匹配器same(value)來確保方法調用的參數是同一個對象when(myClass.methodWithArgument(same(expectedObject))).thenReturn("mockedResult");// 調用被測試方法String result = myClass.methodWithArgument(expectedObject);// 驗證預期行為verify(myClass).methodWithArgument(same(expectedObject));}
}
⑤endsWith()
import org.junit.jupiter.api.Test;
import static org.mockito.ArgumentMatchers.endsWith;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;public class ExampleTest {@Testpublic void testMethodWithEndsWithMatcher() {// 創建mock對象MyClass myClass = mock(MyClass.class);// 調用被測試方法myClass.myMethod("test123");// 驗證方法是否被調用,并且傳入的參數以特定后綴結尾verify(myClass).myMethod(endsWith("123"));}
}

特殊的匹配器,用于驗證實際對存根的調用,例如times()、never()、atLeast()等。

第二章、參數捕捉器

幫助我們捕捉傳遞給模擬對象方法的參數,并且使我們能夠對這些參數進行額外的斷言。在Java中,Mockito庫提供了@Captor注解和ArgumentCaptor類來實現參數捕捉器的功能。

2.1)@Captor

@Captor是Mockito框架中的一個注解,用于捕獲方法調用時傳入的參數,以便在測試中對參數進行斷言或驗證。
參數捕獲:在測試中,使用@Captor可以捕獲方法調用時傳遞的參數,以便在后續的斷言中驗證參數的值。
參數驗證:通過捕獲參數,可以對傳遞給方法的參數進行驗證,確保方法得到了期望的參數值。
靈活性:@Captor提供了一種靈活的方式來處理方法調用時的參數,使得測試更加精確和可靠。

// 示例代碼中使用@Captor注解捕獲參數
@ExtendWith(MockitoExtension.class)
class ExampleTest {@Captor//@Captor注解創建了一個ArgumentCaptor對象private ArgumentCaptor<String> stringCaptor;@Mockprivate SomeClass someClass;@Testvoid testSomething() {// 調用被測試方法someClass.doSomething("test");//verify(someClass)驗證someClass對象的doSomething方法是否被調用//通過stringCaptor.capture()捕獲doSomething方法的參數verify(someClass).doSomething(stringCaptor.capture());//通過stringCaptor.getValue()獲取捕獲的參數值assertEquals("test", stringCaptor.getValue());}
}

2.2)ArgumentCaptor類

ArgumentCaptor argument = ArgumentCaptor.forClass(Class clazz) 創建指定類型的參數捕獲器

argument.getValue() 獲取方法參數值,如果方法進行了多次調用,它將返回最后一個參數值

argument.getAllValues() 方法進行多次調用后,返回多個參數值

@Test
public void argumentCaptor() {// 創建模擬對象List mockList = mock(List.class);List mockList1 = mock(List.class);// 在模擬對象上調用add方法mockList.add("666");mockList1.add("aaa");mockList1.add("ttt");// 獲取方法參數ArgumentCaptor argument = ArgumentCaptor.forClass(String.class);verify(mockList).add(argument.capture());System.out.println(argument.getValue());    //666// 輸出捕獲的參數值,預期為"666"// 多次調用獲取最后一次ArgumentCaptor argument1 = ArgumentCaptor.forClass(String.class);verify(mockList1, times(2)).add(argument1.capture());System.out.println(argument1.getValue());    //ttt// 輸出捕獲的參數值,預期為"ttt"// 獲取所有調用參數System.out.println(argument1.getAllValues());    //[aaa, ttt]// 輸出捕獲的所有參數值,預期為["aaa", "ttt"]
}

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

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

相關文章

vue模板語法中的類和樣式綁定

最近公司要求&#xff0c;在學習前端vue知識&#xff0c;記錄一些語法要點 在綁定類和樣式時&#xff0c;如果使用三目運算(三元運算)時&#xff0c;html中使用的是大括號[], 以及使用數組綁定多個class時&#xff0c;也是大括號&#xff0c; 其他的使用中括號{} 比如&…

什么是ABA問題及ABA問題的解決方法。

什么是ABA問題 ABA問題&#xff1a;一個線程thread1讀到的數據是22&#xff0c;它對數據進行操作后變為23&#xff0c;又有一個線程thread2讀到數據22&#xff0c;對它進行操作后數據變為33并更新回去&#xff0c;又來一個線程3讀取數據33&#xff0c;更新數據為22后又更新回去…

js【詳解】自動類型轉換

運算符 Symbol 數字 會報錯 Cannot convert a Symbol value to a number Symbol 字符串 會報錯 Cannot convert a Symbol value to a string 存在對象&#xff0c;數組&#xff0c;函數時 對象&#xff0c;數組&#xff0c;函數會先執行其 toString() 方法&#xff0c;…

用CSS實現一個扇形

用CSS實現扇形的思路和三角形基本一致&#xff0c;就是多了一個圓角的樣式&#xff0c;實現一個90的扇形&#xff1a; div{border: 100px solid transparent;width: 0;heigt: 0;border-radius: 100px;border-top-color: red; }

【c++】list模擬實現

list的接口 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zjw {template<class T>struct listnode {listnode* <T>_next;listnode* <T>_prev;T _data;listnode(const T& x T()):_prev(nulllptr…

高維中介數據: 聯合顯著性(JS)檢驗法

摘要 中介分析在流行病學和臨床試驗中越來越受到關注。在現有的中介分析方法中&#xff0c;流行的聯合顯著性&#xff08;JS&#xff09;檢驗會產生過于保守的 I 類錯誤率&#xff0c;因此功效較低。但是&#xff0c;如果在使用 JS 測試高維中介假設時&#xff0c;可以準確控制…

人力資源(E-HR)應用架構的設計與實踐

當談到人力資源管理時&#xff0c;電子人力資源&#xff08;E-HR&#xff09;系統已經成為現代企業不可或缺的組成部分。E-HR系統的設計與實踐對于提高組織的人力資源管理效率和員工體驗至關重要。本文將探討E-HR應用架構的設計與實踐&#xff0c;以及如何借助信息技術優化人力…

docker清理閑置鏡像郵件發送

腳本名稱 DockerImage_Clear.sh腳本內容 #!/bin/bash # 清除閑置的docker鏡像 #docker image prune -a -f # 列出可清理的docker鏡像 /usr/local/bin/docker images | grep "<none>" # 列出可清理的docker鏡像數量 /usr/local/bin/docker images | grep …

怎么使用Pyecharts庫對淘寶數據進行可視化展示

目錄 一、準備工作 二、數據預處理 三、使用Pyecharts進行可視化展示 柱狀圖展示銷量和評價數 散點圖展示價格與銷量關系 詞云圖展示商品標題關鍵詞 四、總結與建議 在當今的大數據時代&#xff0c;數據可視化已經成為了一個非常重要的技能。Pyecharts是一個基于Python的…

NIO群聊系統的實現

一、前言 通過NIO編寫簡單版聊天室&#xff0c;客戶端通過控制臺輸入發送消息到其他客戶端。注意&#xff1a;并未處理粘包半包問題。 二、邏輯簡述 服務器&#xff1a; 1&#xff09;創建服務器NIO通道&#xff0c;綁定端口并啟動服務器 2&#xff09;開啟非阻塞模式 3&…

C++ //練習 10.24 給定一個string,使用bind和check_size在一個int的vector中查找第一個大于string長度的值。

C Primer&#xff08;第5版&#xff09; 練習 10.24 練習 10.24 給定一個string&#xff0c;使用bind和check_size在一個int的vector中查找第一個大于string長度的值。。 環境&#xff1a;Linux Ubuntu&#xff08;云服務器&#xff09; 工具&#xff1a;vim 代碼塊 /*****…

Altium Designer 22焊接輔助工具 Interactivehtmlbom 插件使用教程

目錄 AD22 由Interactivehtmlbom 插件生成的焊接輔助圖&#xff0c;交互方式很多&#xff0c;十分方便的為我們提供便利。 介紹安裝教程&#xff1a; 前去這個網站 Interactivehtmlbom 插件&#xff0c;單擊下載zip 下載完成后找個地方解壓&#xff0c;雙擊Initablelize.bat文…

河道水庫雨水情自動測報系統

隨著科學技術的不斷進步&#xff0c;以及城市化進程的影響&#xff0c;水庫的管理變得更加復雜&#xff0c;要實現城市水庫的精細化管理&#xff0c;必須借助先進的信息技術手段為支撐&#xff0c;實現對三防、水資源、供水安全的實時監控&#xff0c;優化管理模式和創新管理手…

餐飲廢水處理設備定制廠家

諸城市鑫淼環保小編帶大家了解一下餐飲廢水處理設備定制廠家 1.餐飲廢水問題 餐飲業是重要的經濟領域&#xff0c;但其廢水排放帶來的環境問題不容忽視。餐飲廢水含有高濃度的有機物、油脂、殘渣等&#xff0c;若未經處理直接排放&#xff0c;會嚴重污染水源&#xff0c;危害環…

Matlab 機器人工具箱 例程:運動學+動力學+路徑規劃+可視化

文章目錄 1 創建機器人2 機器人顯示3 機器人示教4 機器人路徑規劃&#xff1a;給定關節角路徑5 機器人路徑規劃&#xff1a;給定末端位姿&#xff0c;求關節角路徑6 工作空間可視化參考鏈接 1 創建機器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…

【Python】快速入門Python一天學完基礎語法

文章目錄 前言1. HelloWorld2. 變量與數據類型2.1 變量2.2 數據類型2.2.1 String 字符串類型2.2.2 基本類型轉換2.2.2 元組2.2.3 字典2.2.4 拆包 2.3 運算2.3.1 雙除號/雙乘號2.3.2 常見運算函數舉例2.3.3 布爾運算 3. 控制流程3.1 if-else 語句3.2 while 循環3.3 for 循環 4. …

子線程如何獲取Request

子線程獲取Request 有時候在進行業務處理時對于一些對于業務不那么重要且對于返回結果無關的情況會開啟一個新的線程進行處理&#xff0c;但是在開啟新線程進行處理時發現無法從RequestContextHolder中獲取到當前的請求&#xff0c;取出來是null 這是因為RequestContextHolder中…

逆變器專題(14)-弱電網下的LCL逆變器控制以及諧振峰問題(1)

相應仿真原件請移步資源下載 LCL濾波器 LCL濾波器因其本身為一個二階系統&#xff0c;其本身就會引發諧振&#xff0c;導致相應諧振頻率處的增益得到放大&#xff0c;進而產生諧波等問題&#xff1b;另一方面&#xff0c;在弱電網下&#xff0c;逆變器會與電網阻抗發生耦合&am…

ARM總結and復習

安裝交叉編譯工具鏈 a. 為什么安裝 因為arm公司的指令集在不斷迭代升級&#xff0c;指令集日益增多,而架構是基于指令集研發的&#xff0c;所以架構不一樣&#xff0c;指令集也不一樣 eg:arm架構使用的是arm指令集 x86架構使用的是x86指令集 而我們日常開發環境中linux的架構…

重載(Overload)和重寫(Override)的區別。重載的方法能否根據返回類型進行區分?

大家好我是蘇麟 , 今天開始又一個專欄開始了(又一個坑 哈哈) . 重載&#xff08;Overload&#xff09;和重寫&#xff08;Override&#xff09;的區別。重載的方法能否根據返回類型進行區分&#xff1f; 方法的重載和重寫都是實現多態的方式&#xff0c;區別在于前者實現的是編…