单元测试:参数匹配器和参数捕捉器

目录标题

  • 第一章、参数匹配器
    • 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.mzph.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;区别在于前者实现的是编…