【Java】Mockito捕获多次调用的方法的参数

Mockito使用详解 Mockito 是一个针对 Java 的单元测试模拟框架,可以简化单元测试过程中测试上下文对象。它可以做如下事情: 1)模拟方法的返回值、模拟抛出异常 2)验证方法被调用次数、验证方法参数类型 3)捕获方法参数值 4)为真实对象创建一个监控(spy)对象 注意: 1)不能 Mock 静态方法 2)不能 Mock private 方法 3)不能 Mock final class 阅读详情

整理Mockito结合ArgumentCaptor捕获多次调用的方法的参数

今天在对业务代码进行开发时,发现需要捕获多次调用的方法的参数,验证参数传递的正确性,这里对获取方法进行总结。

首先,模拟一个简单的测试场景,有一个对外提供服务的类:

@Component
public class CaptorLearning {

    private DalService dalService;

    @Autowired
    public CaptorLearning(DalService dalService) {
        this.dalService = dalService;
    }

    public int getResult(int num1, int num2, int num3) {
        int result1 = dalService.doHandle(num1, num2);
        int result2 = dalService.doHandle(num1, num3);
        return result1 + result2;
    }
}

有一个内部的业务处理类:

@Component
public class DalService {
    public int doHandle(int num1, int num2) {
        return num1 + num2;
    }
}

这里要对CaptorLearning进行单元测试覆盖,因此需要判断dalService两次调用了doHandle方法,并获取相应的参数,判断是否参数调用正确。

首先是两次调用,可以利用Mockito提供的verify方法,来判断调用次数,代码如下:

	@Test
    public void testByVerify() {
        captorLearning.getResult(num1, num2, num3);
        Mockito.verify(dalService, times(2)).doHandle(Mockito.anyInt(), Mockito.anyInt());
    }

如果此时,要判断两次调用doHandle方法的参数,可以利用ArgumentCaptor的capture方法进行模拟,再通过getAllValues方法来获取所有的参数值,代码如下:

    @Test
    public void testWithArgumentCaptor() {
        captorLearning.getResult(num1, num2, num3);
        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
        Mockito.verify(dalService, times(2)).doHandle(Mockito.anyInt(), integerArgumentCaptor.capture());
        
        // 拿到ArgumentCaptor捕获的参数List,通过下标,按照调用时机,依次取出
        List<Integer> list = integerArgumentCaptor.getAllValues();
        Assert.assertEquals(num2, list.get(0).intValue());
        Assert.assertEquals(num3, list.get(1).intValue());
    }

有时候可能我们捕获的虽然是方法调用的同一个参数,但有可能参数类型会不同,例如还是上面的场景,两个类都新增了方法:

@Component
public class DalService {
    public int doHandle(int num1, int num2) {
        return num1 + num2;
    }

    public <T> void doHandle(T data1, T data2, T data3, Class<T> clazz) {
        // doing ...
    }
}

@Component
public class CaptorLearning {
    private DalService dalService;

    @Autowired
    public CaptorLearning(DalService dalService) {
        this.dalService = dalService;
    }

    public int getResult(int num1, int num2, int num3) {
        int result1 = dalService.doHandle(num1, num2);
        int result2 = dalService.doHandle(num1, num3);
        return result1 + result2;
    }

    public void getResult(int num1, int num2, int num3, String string1, String string2, String string3) {
        dalService.doHandle(num1, num2, num3, Integer.class);
        dalService.doHandle(string1, string2, string3, String.class);
    }
}

这时候如果还是使用上面的测试方式,则会报错,因为String类型没办法转成Integer类型。

这里一种简单的解决办法,就是创建两个ArgumentCaptor,分别进行获取,再根据特定的下标,来获取某次调用时的捕获的参数,代码如下:

    @Test
    public void testWithTwoArgumentCaptor() {
        captorLearning.getResult(num1, num2, num3, string1, string2, string3);
        // 参数捕获器1,用于捕获参数类型为Integer类型的参数
        ArgumentCaptor<Integer> integerArgumentCaptor = ArgumentCaptor.forClass(Integer.class);
        Mockito.verify(dalService, times(2)).doHandle(integerArgumentCaptor.capture(), any(), any(), any());
        // 第一次调用时,参数类型为Integer类型,取出值进行校验
        Assert.assertEquals(num1, integerArgumentCaptor.getAllValues().get(0).intValue());

        // 参数捕获器2,用于捕获参数类型为String类型的参数
        ArgumentCaptor<String> stringArgumentCaptor = ArgumentCaptor.forClass(String.class);
        Mockito.verify(dalService, times(2)).doHandle(stringArgumentCaptor.capture(), any(), any(), any());
        // 第二次调用时,参数类型为String类型,取出值进行校验
        Assert.assertEquals(string1, stringArgumentCaptor.getAllValues().get(1));
    }

总结:

利用ArgumentCaptor的capture方法进行mock,再通过getAllValues方法,可以捕获多次调用的方法的参数。

单元测试进阶Mockito Mockito 文章目录Mockito简介使用准备工作创建mock对象验证mock对象是否执行了某些操作打桩参数匹配器验证方法的调用次数/最多/最少/从不等返回值为void的方法调用时抛异常打桩验证执行顺序验证没有任何交互检查是否还有没有验证的交互简化Mock创建,注解驱动连续打桩回调打桩doReturn()、doThrow()、doAnswer()、doNothing()、doCallRealMethod()系列方法的运用监视真实的对象resetdetail自定义失败打印信息laambda支持原理限制 简 阅读详情

相关推荐

CHIP-Seq数据分析流程

文章目录CHIP-Seq数据分析流程相关软件安装数据下载将SRA转化为fastq文件数据质控,过滤数据质控然后进行质控,过滤低质量reads,去接头比对下载小鼠参考基因组的索引和注释文件比对sam文件转bam为bam文件建立索引载入IGV查看用MACS call peak安装MACS结果注释与可视化 CHIP-Seq数据分析流程 相关软件安装 所需要的软件有sratoolkit, fastqc,bowtie2,samtools,macs2,htseq-count,bedtools和前面RNA-seq数据分析

bio_meimei的博客 8788

【JAVA-UT】20、ArgumentCaptor的使用

文|码术张 有时,不仅要验证对象的方法是否被调用,还要检查传给方法的参数是否正确。 今天,埃德蒙的工作是给类DownloadActive写ut。 DownloadActive的功能是下载软件,并将成功与否的结果通知Listener. doTask首先做下载的动作,然后发通知。 发通知,即调用listener的report方法。 为了方便说明,将doTask简化,只是通知侦听者们一个字符串“OK”。...

liangjing1000的专栏 3240

逆向工程师视角:拆解DataDome滑块验证码的3层防护机制与绕过思路

本文从逆向工程师视角,深入剖析DataDome滑块验证码的三层核心防护机制。第一层通过动态加密参数实现会话绑定与抗重放;第二层采集TLS指纹、鼠标轨迹动力学等多维行为数据进行一致性验证;第三层则是基于机器学习的后端异步风险决策引擎。文章不仅拆解了其技术原理,更分享了模拟、钩取等超越单纯工具调用的底层分析与绕过思路。

f6g7h8i9j的博客 730

单元测试(系列4):参数匹配器和参数捕捉器

Mockito框架中的参数匹配器是用于在测试中进行灵活验证和存根设置的工具。如果使用了参数匹配器,方法中的所有参数都必须是匹配器。 参数匹配器列表:示例:使用anyInt()方法来指定参数的范围,从而实现了对mockList.get()方法的灵活验证和存根设置。 ②any(Class type) 示例:使用参数匹配器any(Class type)来存根方法 ③eq() 示例:使用参数匹配器eq(value)来存根方法 ④same(expectedObject) ⑤endsWith() 特殊的匹配器,

baomingshu的博客 1953

Flink CDC 1.18.1 Oracle 数据同步到postgresql

8、修改Flink的配置文件,主要是各种服务的绑定地址,默认为localhost,统统改为0.0.0.0,如:rest.address: 0.0.0.0 #localhost。将flink-sql-connector-oracle-cdc-3.0.1.jar复制到flink-1.18.1/lib目录中。6、下载 flink-connector-jdbc-3.1.1-1.17.jar,postgresql-42.7.3.jar。7、安装postgresql就不说了,相信你已经有了数据库了。

ynzhangyao的专栏 1799

我用 Claude Code 给 Spring Boot 老项目做了一次代码 Review:查出 4 类隐藏问题

接手 Spring Boot 老项目时,真正麻烦的往往不是编译报错,而是分散在业务代码中的空指针、N+1 查询、异常吞没和并发隐患。本文记录一次使用 Claude Code 辅助代码 Review 的完整流程,并给出提示词、Java 示例、修改方案和人工复核方法。

海波的专栏 396

java 调用多次_关于java:Mockito可以捕获多次调用方法的参数吗?

我有一个方法被调用两次,我想捕获第二个方法调用的参数。以下是我的尝试:ArgumentCaptor firstFooCaptor = ArgumentCaptor.forClass(Foo.class);ArgumentCaptor secondFooCaptor = ArgumentCaptor.forClass(Foo.class);verify(mockBar).doSomething(fi...

weixin_39785422的博客 808

wps js宏获取工作簿、工作表、单元格的值、链接转图片、单元格区域数据转二维数组、保存工作簿的常用Excel操作

wps js宏入门看这里,我写了常用的js操作Excel的方法:获取工作簿对象、获取工作表对象、获取单元格的值、链接转图片、生成条形码图片、单元格区域数据转二维数组方法、保存工作簿、弹出输入框、YesNo选择框,助你从VBA转战JS。

huaermeier的博客 3万+

参数捕获与分析

开发者可以深入方法调用的细节,确保数据传递的准确性和业务逻辑的可靠性。结合断言库和异步等待机制,能够覆盖从简单到复杂的所有测试场景。参数捕获是 Mockito 提供的核心功能之一,允许开发者捕获方法调用时传递的实际参数,并进行详细验证。,可以深入分析参数内容,确保交互逻辑符合预期,尤其适用于验证复杂对象或多次调用的场景。参数捕获与分析是单元测试中验证复杂交互逻辑的关键技术。

weixin_43476824的博客 810

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

Python爬虫实战:如何爬取12306列车信息

本文介绍了如何使用Python编写爬虫,抓取12306列车信息。我们讲解了如何分析12306的列车数据接口,如何发送HTTP请求,解析返回的JSON数据,并将数据保存到本地文件中。我们还讨论了如何绕过反爬虫机制,如使用随机User-Agent和设置请求延时。通过这个实战项目,你应该掌握了如何爬取并解析来自公共API的数据,同时提高了你的爬虫技能。这些技能不仅适用于12306列车信息抓取,也可以广泛应用于其他需要抓取JSON数据的网站。

2201_76125261的博客 1921

java 调用多次_Mockito可以捕获多次调用方法的参数吗?

从Mockito 2.0开始,也有可能使用静态方法Matchers.argThat(ArgumentMatcher) . 在Java 8的帮助下,它现在更清晰,更易读:verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("OneSurname")));verify(mockBar).doSth(argThat((arg...

weixin_35086195的博客 250

8、 使用TPM密钥:从理论到实践的全面指南

本文全面介绍了如何使用TPM(可信平台模块)进行密钥管理,涵盖密钥的创建、存储、加载、迁移以及特殊密钥类型的使用。通过详细的操作步骤和代码示例,帮助读者掌握TPM密钥管理技术,确保系统的安全性和可靠性。

weixin_36212459的博客 242

java unit test moke_Java Unit Test - Mockito 验证参数

1.验证参数package mockito;import org.junit.Test;import org.mockito.ArgumentCaptor;import java.util.List;import static org.junit.Assert.assertArrayEquals;import static org.junit.Assert.assertEquals;import...

weixin_30599809的博客 270

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Mockito 捕获参数

– Start package demo11; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; @SuppressWa...

千里之行始于足下 2276

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Mockito 多次调用返回不同值

– Start package demo09; import java.util.List; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @SuppressWarnings("unchecked") class Different...

千里之行始于足下 2万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

捕获方法参数有妙招:MockitoTutorialForBeginners之ArgumentCaptor完全指南

MockitoTutorialForBeginners是一个专为初学者设计的Mockito教程项目,它通过丰富的实例和清晰的步骤,帮助开发者掌握Mockito框架在单元测试中的应用。其中,ArgumentCaptor作为Mockito的重要功能,能够轻松捕获方法参数,让测试验证更加灵活和精准。 ## 什么是ArgumentCaptor?🤔 在单元测试中,我们经常需要验证某个方法是否被正确调用

gitblog_00670的博客 985

Java 测试 04:Mockito 验证方法调用次数(verify (times ()))

摘要:本文介绍了Mockito框架中验证方法调用次数的核心方法verify(times())的使用。该方法通过指定期望调用次数(如times(1)验证恰好调用一次,times(0)验证未被调用),帮助开发者确保测试代码行为符合预期。文章结合实例展示了如何验证EmailService发送欢迎邮件的次数,以及如何确认无效订单不触发通知服务。这种验证方式对于确保业务逻辑正确性、防止意外调用、验证条件分支以及监控副作用具有重要意义,是编写高质量单元测试的关键技术之一。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Mockito 中捕获 mock 对象方法的调用参数

Mockito 可以帮助我们创建 Mock 对象,mock 被...

weixin_34297300的博客 2217

Mockito教程

https://www.cnblogs.com/Ming8006/p/6297333.html 目录 1Mockito 介绍 1.1Mockito是什么? 1.2为什么需要Mock 1.3Stub和Mock异同 1.4Mockito资源 1.5使用场景 2使用Mockito 2.1验证行为 2.2模拟我们所期望的结果 2.3RETURNS_SMART_NULLS和RETURNS_DEEP_STUBS 2.4模拟方法体抛出异常 2.5使用...

小强快跑~~ 9886

mockito验证参数_Mockito验证

mockito验证参数 本文是我们名为“ 用Mockito测试 ”的学院课程的一部分。 在本课程中,您将深入了解Mockito的魔力。 您将了解有关“模拟”,“间谍”和“部分模拟”的信息,以及它们相应的存根行为。 您还将看到使用测试双打和对象匹配器进行验证的过程。 最后,讨论了使用Mockito的测试驱动开发(TDD),以了解该库如何适合TDD的概念。 在这里查看 ! 目录 ...

最佳 Java 编程 6674

Mockito 验证方法调用次数

– Start package demo07; import java.util.List; import org.junit.jupiter.api.Test; import org.mockito.Mockito; @SuppressWarnings("unchecked") class VerifyMethodCalledTest { @Test void test() { ...

千里之行始于足下 2万+

Mockito打桩测试-多次调用返回不同结果

以下demo简单演示: 使用Mockito框架来模拟(mock)和测试桩(stub)对象的行为,以便在编写单元测试代码时测试某个方法或类的功能。方式三: 在以上的基础上,再增加根据参数的不同区分调用次数,返回不同的结果。方式二: 在以上的基础上再增加根据调用次数,返回不同的结果。方式一: 判断参数,根据不同参数判断,返回不同结果。ps: 以下demo未使用verify()流程。

zoeou的博客 2797

Mockito框架下如何优雅的验证调用Mock对象方法的入参

在单元测试场景中,为了测试某一个类通常需要mock其依赖的的类,再通过验证传给被调用的Mock对象的方法的入参是否符合期望来验证被测类业务实现的正确性。在Mockit测试框架下,通常是通过在argThat中使用lambda表达式来判断参数的正确性。这种方法具有代码不优雅和无法从测试用例错误信息中定位出不符合期望的入参参数的问题。本博客介绍了利用Mockit测试框架@Captor注解可以捕获Mock对象的方法的入参,再通过assert判断参数是否符合期望。通过该方法可以让测试代码更优雅,错误提示信息更有效。

每天学习一点点,每天记录一点点 3713

如何用 Mockito 玩转单元测试

当我们需要测试某个类的功能时,但又不希望依赖其外部组件或复杂的对象时,可以使用 Mockito 来创建模拟对象,这些模拟对象可以控制方法返回值、抛出异常或执行特定的逻辑。stubbing 是模拟(mock)对象行为的过程,指的是为模拟对象的方法调用提供预定义的返回值或行为。Mockito 是一个广泛使用的 Java 测试框架,它提供了简洁而强大的功能,用于模拟(mock)和验证对象的行为,尤其是在单元测试中。Stubbing 是指通过明确的指令为模拟对象的方法调用提供预定义的返回值或行为。

深耕后端、偏爱架构,用代码与设计构建可靠系统 1732
上一篇: 【Spring Boot】5. @ConfigurationProperties(prefix=xx) 单元测试注入
下一篇: 【Git】常用指令整理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值