mockito的详细使用

news2024/11/23 22:51:08

目录

1.概述

2.使用

2.1.依赖

2.2.校验

2.2.1.值校验

 2.2.2.顺序校验

2.2.3.指定返回 

2.3.注解

2.3.1.@Mock

2.3.2.@Spy

2.3.3.@Captor

2.3.4.@InjectMocks


1.概述

mock,一种JAVA单元测试技术,mock允许使用模拟对象替换测试中的系统部件,并断言它们是如何被使用的一项技术。

当某个接口或者功能模块依赖于其他接口或者模块,而所依赖的模块或接口未开发完毕,可以使用mock模拟依赖的模块。

mockito,JAVA单元测试中使用频率最高的mock框架之一。

mock遵循流程:输入—期望—验证

2.使用

2.1.依赖

注释:博主用的3.8.0,具体版本号有哪些可以去maven repository上查。

<dependency>
     <groupId>org.mockito</groupId>
     <artifactId>mockito-core</artifactId>
     <version>${version}</version>
     <scope>test</scope>
</dependency>

2.2.校验

2.2.1.值校验

校验值是否是期待值。

 2.2.2.顺序校验

inOrder可以校验方法的调用顺序是否是按照之前的调用顺序。

2.2.3.指定返回 

指定返回值是mock的最大价值也是最常用的,指定返回值可以用来伪造一个假的返回值,从而绕过对于真实对象的调用。如果真实对象的调用很复杂,入参或者调用条件很苛刻,那么直接用mock的指定返回功能绕过即可,这是很有价值的。

注意:

mock只是生成了一个壳子,不是真的创建了一个对象,无法进行状态的维护,需要对每个行为对应的属性都要进行自定义,如以下代码即使调用了set方法,也不会为属性赋值,属性仍然为null。

@Test
public void test(){
	Person mockPerson=Mockito.mock(Person.class);
    mockPerson.setName("bugMan");
    assert mockPerson.getName()==null:"name属性值为空";
}

2.3.注解

除了编码的方式外,还提供了注解方式进行使用,从而使代码变得更加简洁。

2.3.1.@Mock

@Mock和Mockito.mock()功能相同。

@Mock
HashMap<String, Integer> mockHashMap;

@Test
public void saveTest()
{
    //输入
    mockHashMap.put("A", 1);
	//期望
    Mockito.verify(mockHashMap).put("A", 1);
    

    assert mockHashMap.size()==0;
}

2.3.2.@Spy

@Spy和@Mock不同的是@Mock创建的是个壳子,而@Spy创建的真的是个对象,可以进行状态维护。

@Spy
HashMap<String, String> hashMap;

@Test
public void saveTest()
{
	//输入
    hashMap.put("name", "bugMan");
	//期望
    Mockito.verify(hashMap).put("name", "bugMan");

    assert hashMap.size()==1;
}

2.3.3.@Captor

@Captor注释用于创建ArgumentCaptor对象,该类型的对象可以用来捕获参数。

@Mock
HashMap<String, String> hashMap;

@Captor
ArgumentCaptor<String> keyCaptor;

@Captor
ArgumentCaptor<String> valueCaptor;

@Test
public void saveTest() 
{
    hashMap.put("name", "bugMan");

    Mockito.verify(hashMap).put(keyCaptor.capture(), valueCaptor.capture());

    assert "name".equals(keyCaptor.getValue());
    assert "bugMan".equals(valueCaptor.getValue());
}

2.3.4.@InjectMocks

@InjectMocks用来进行@Mock的注入,目的就是去掉手动注入,让代码变得简洁。

以一个service层注入dao层的操作为例:

dao层:

@Repository
public class MyRepository {
 
    public void doSomething() {
        System.out.println("here's dosomething");
    }
 
    public Model findById(Long id) {
        return new Model(id, "Real Repository");
    }
}

service层:

@Service
public class MyService {
 
    @Autowired
    private MyRepository myRepository;
 
    public void doSomething() {
        this.myRepository.doSomething();
    }
 
    public Model findById(Long id) {
        return this.myRepository.findById(id);
    }
}

没有@InjectMocks的话,需要手动注入:

MyRepository myRepository = Mockito.mock(MyRepository.class); 
MyService myService = new MyService(myRepository);

有@InjectMocks的话直接声明即可,@Mock注解的对象会自动注入进@InjectMocks注解的对象:

	@Mock
    private MyRepository myRepository;
 
    @InjectMocks
    private MyService myService;
 
    @Test
    public void testInjectMocks() {
        System.out.println(myService.getMyRepository().getClass());
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Redis】Redis 分布式锁

文章目录概述Redis 实现分布式锁加锁释放锁死锁概述 在单体项目中&#xff0c;我们处理多线程同时操作某一处代码块或者变量时就使用 Synchronized 或者 Lock 锁去保证数据的安全性&#xff0c;但是&#xff0c;现在我们基本上都是使用微服务&#xff0c;当我们把服务部署到多…

一文说透小程序插件及其作用价值

最近工作接触小程序插件比较多&#xff0c;就想着不如跟大家系统分享一下小程序插件相关的内容。 首先&#xff0c;我们要先弄清楚小程序插件究竟是什么&#xff1f; 简单来说&#xff0c;小程序插件就是可被添加到小程序内直接使用的功能组件。插件依附于主程序的辅助程序&a…

详解c++---string的介绍(上)

这里写目录标题什么是stringstring的构造函数string的赋值重载string的遍历第一种方式 [ ]第二种方式 范围for第三种方式 正向迭代器反向迭代器string中的capacitysize lengthmax_sizecapacityreserveresizeshrink_to_fitstring的element access什么是string 那这里大家就只用…

k8s编程operator实战之云编码平台——③Code-Server Pod访问实现

文章目录1、openresty介绍和安装2、实现code-server的反向代理3、动态反向代理实现启动多个code-server访问k8s编程operator系列&#xff1a;k8s编程operator——(1) client-go基础部分k8s编程operator——(2) client-go中的informerk8s编程operator——(3) 自定义资源CRDk8s编…

【提高代码可读性】—— 手握多个代码优化技巧、细数哪些惊艳一时的策略

回顾 前期 趁着下班前五分钟书写——Vue3通讯(常规写法、语法糖、v-modle、兄弟通讯)_0.活在风浪里的博客-CSDN博客Vue3 组件通讯https://blog.csdn.net/m0_57904695/article/details/128145150?spm1001.2014.3001.5501 目录 一、可选链接运算符【&#xff1f;.】 二、空…

AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库

&#xff08;1&#xff09;因为AD20需要自己画原理图库和PCB库。所以我建议新手先用立创EDA画好原理图&#xff0c;转换为PCB&#xff08;注意&#xff0c;只需要转换出PCB即可&#xff0c;因为我们需要立创EDA的PCB库。不懂没关系&#xff0c;后面就清楚了&#xff09; &#…

把随身WiFi的esim卡移植到SIM卡放到手机使用

esim移植到实体sim卡&#xff0c;手把手教你esim改实体卡操作 自用先机的棒子&#xff0c;3-5倍虚标&#xff0c;在单位用&#xff0c;网速还行就是信号不好&#xff0c;uz801_v3.0的板子&#xff0c;410单天线&#xff0c;没有改装潜力&#xff0c;发热还大&#xff0c;加了风…

炸裂!速度百倍提升,高性能 Python 编译器 Codon 火了!

众所周知&#xff0c;Python 是一门简单易学、具有强大功能的编程语言&#xff0c;在各种用户使用统计榜单中总是名列前茅。相应地&#xff0c;围绕 Python&#xff0c;研究者开发了各种便捷工具&#xff0c;以更好的服务于这门语言。 编译器充当着高级语言与机器之间的翻译官…

[附源码]Nodejs计算机毕业设计基于Web企业客户管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

数据分析图表-FineReport 图表切换接口

1. 概述 1.1 问题描述 图表往往是按照从左往右或从右往左的顺序来切换。那么如何实现点击图表直接切换到其他不相邻的图表呢&#xff1f;效果如下图所示&#xff1a; 1.2 实现思路 给图表添加 JavaScript 类型的超级链接&#xff0c;调用图表接口FR.Chart.WebUtils.getChart(…

如何选择美股l2接口类型?

如何选择美股l2接口类型&#xff1f; 首先要选择稳定的美股l2接口&#xff0c;因为在进行股票行情分析的时候对于其数据的真实性和准确性都有很高的要求。不靠谱的数据平台容易造成数据传输卡顿&#xff0c;或数据获取不准确的情况&#xff0c;轻则影响企业运作&#xff0c;重…

SpringSecurity[6]-Thymeleaf中Spring Security的使用/退出登录/Spring Security中CSRF

上一篇:SpringSecurity[5]-基于表达式的访问控制/基于注解的访问控制/Remember Me功能实现 链接:SpringSecurity[4]-访问控制url匹配/内置访问控制方法介绍/角色权限判断_豆虫儿的博客-CSDN博客 十一、基于表达式的访问控制 十四、Thymeleaf中Spring Security的使用 Spring…

java计算机毕业设计基于安卓Android的校园财务流水系统APP

项目介绍 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设…

Unity脚本基础

【重点面试题】1、Unity3D中的协程&#xff08;coroutine&#xff09;&#xff0c;C#线程和进程之间的区别是什么&#xff1f; 简记&#xff1a;协程和线程区别 协程(协同程序Coroutine): 同一时间只能执行某个协程。开辟多个协程开销不大。协程适合对某任务进行分时处理。 Un…

workerman+TP6实战网站客服系统之项目初始化

TP6 官方手册: 安装 ThinkPHP6.0完全开发手册 看云 安装TP6: composer create-project topthink/think tp6 报错: 解决问题: PHP默认把这个 proc_open 函数禁用了,取消禁用即可 取消禁用函数流程参考之前一篇文章 php workerman入门之运行起来_山山河川的博客-CSDN博…

Java中的匿名内部类

一、什么是匿名内部类&#xff1f; 定义&#xff1a;巴拉巴拉巴拉&#xff0c;就不写了。 语法&#xff1a; 部分内容来源于&#xff1a;什么是匿名内部类&#xff0c;如何使用匿名内部类_Weihaom_的博客-CSDN博客_匿名内部类 二、为什么要有匿名内部类&#xff1f; 在开发…

【大数据入门核心技术-Flume】(二)Flume安装部署

目录 一、准备工作 1、基本Hadoop环境安装 2、下载安装包 二、安装 1、解压 2、修改环境变量 3、修改并配置 flume-env.sh 文件 4、验证是否安装成功 一、准备工作 1、基本Hadoop环境安装 参考 Hadoop安装 【大数据入门核心技术-Hadoop】&#xff08;五&#xff09…

Spring WebSocket通信应用

文章目录前言一、客户端-服务端双向通信交互图二、项目说明1.引入包2.项目各模块说明问题参考前言 本文章主要记录项目客户端-服务端双向通信解决方案&#xff0c;基于Spring WebSocket架构实现双向数据通信; 以及项目实际应用中的一些问题与解决手段。一、客户端-服务端双向通…

[附源码]Node.js计算机毕业设计高铁乘坐舒适性在线调查及评价系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

挑灯夜战800个小时,终从外包成功上岸字节!入职那一天我眼眶湿润了

P8Java导图笔记 主目录&#xff1a; Java基础篇&#xff1a; JAVA基础对应详细解析文档 Java多线程并发篇&#xff1a; Java多线程并发知识点对应详解解析文档 JVM篇&#xff1a; JVM脑图对应详细文档解析 Spring原理 Spring原理对应详细解析文档 数据库 数据库对应详细解析文档…