当前位置: 首页 > news >正文

[Springboot 单元测试笔记] - Mock 和 spy的使用

Springboot单元测试 - 依赖类mock测试

通常单元测试中,我们会隔离依赖对于测试类的影响,也就是假设所有依赖的一定会输出理想结果,在测试中可以通过Mock方法来确保输出结果,这也就引入另一个测试框架Mockito。

Mockito框架的作用就是模拟接口功能,并不运行模拟接口的实际逻辑,而是直接输出一个假定结果。

Mockito常见注释及方法

@Mock被注释的对象会作为Mock对象
@InjectMocks被注释的对象依赖于@Mock的对象,通常是测试对象
when(<MockObject>.<method>).thenReturn()对@Mock的对象进行模拟输出
doThrow(<Exception>).when(<mockObject>).<Method>对Mock的对象模拟抛出一个异常
spy()也是建立一个模拟对象,但可以

待测试类 - AController

public class AController {@AutowiredMongoService mongoService;public boolean testBean() {boolean res = mongoService.testMethod2(4);return res;}}

依赖类 - MongoService

@Service
public class MongoService {public void output() {System.out.println("This is a bean!!");}public boolean testMethod1(int num) {return num > 0;}public boolean testMethod2(int num) {int val = getVal();return val > num;}private int getVal() {return 2;}
}

Mockito测试类 - RunWith需要运行MockitoJUnitRunner.class才能使用Mockito相关注解

方法1: 使用@Mock,更为简洁只需加入注解就可以mock对应成员变量 (该成员变量可以是非依赖注入)

@RunWith(MockitoJUnitRunner.class)
public class MockTest {@MockMongoService mongoService;@InjectMocksAController aController;@Testpublic void testMock1() {when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);Assert.assertEquals(aController.testBean(), true);}@Test(expected = Exception.class)public void testMock2() {doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());aController.testBean();}
}

方法2: 使用Mock函数

public class MockTest {MongoService mongoService;AController aController;@BeforeEachpublic void init() {mongoService = Mock(MongoService.class);aController = new AController();/* 假设 AController class 中有setter用于加载mongoService */aController.setMongoService(mongoService);}@Testpublic void testMock1() {when(mongoService.testMethod2(Mockito.anyInt())).thenReturn(true);Assert.assertEquals(aController.testBean(), true);}@Test(expected = Exception.class)public void testMock2() {doThrow(Exception.class).when(mongoService).testMethod2(Mockito.anyInt());aController.testBean();}
}

 

@Mock 和 @Spy区别

上面两种注释都是建立一个模拟对象,但是区别是@Mock注释的对象是完全虚拟,不能调用这个Mock对象的任何方法,只能通过when().thenReturn() 来进行模拟输出;但是@Spy是建立一个真实的Mock对象,可以调用对象中任何方法也可以模拟某些方法的输出。@Spy大大增加了测试的自由度,比如如果某个测试类你只想模拟某个方法但是想要某些方法的真实输出,这是@Spy就可以解决这个问题。

举例 - 模拟MongoService其中一个方法,并测试另一个方法真实输出

    @SpyMongoService mongoServiceSpy;@Testpublic void testSpy() {/** 模拟MongoService中 getVal并测试testMethod2*/when(mongoServiceSpy.getVal()).thenReturn(3);Assert.assertEquals(mongoServiceSpy.testMethod2(2), true);}

Reference

  • SpringBoot Test及注解详解 - codedot - 博客园
  • 单元测试之Mockito与PowerMock - 简书

相关文章:

[Springboot 单元测试笔记] - Mock 和 spy的使用

Springboot单元测试 - 依赖类mock测试 通常单元测试中&#xff0c;我们会隔离依赖对于测试类的影响&#xff0c;也就是假设所有依赖的一定会输出理想结果&#xff0c;在测试中可以通过Mock方法来确保输出结果&#xff0c;这也就引入另一个测试框架Mockito。 Mockito框架的作用…...

互联网新时代要来了(二)什么是AIGC?

什么是AIGC&#xff1f; 最近&#xff0c;又火了一个词“**AIGC”**2022年被称为是AIGC元年。那么我们敬请期待&#xff0c;AIGC为我们迎接人工智能的下一个时代。 TIPS:内容来自百度百科、知乎、腾讯、《AIGC白皮书》等网页 什么是AIGC&#xff1f;1.什么是AIGC&#xff1f;…...

75V的TVS二极管有哪些型号?常用的

瞬态抑制TVS二极管工作峰值反向电压最低3.3V&#xff0c;最高可达513V&#xff0c;甚至更高。很多电子工程师都知道&#xff0c;TVS二极管在实际应用选型过程中&#xff0c;第一步要确认的就是其工作峰值反向电压。2023年春节已过&#xff0c;东沃电子正月初八就开工了&#xf…...

测试开发之Django实战示例 第十章 创建在线教育平台

第十章 创建在线教育平台在上一章&#xff0c;我们为电商网站项目添加了国际化功能&#xff0c;还创建了优惠码和商品推荐系统。在本章&#xff0c;会建立一个新的项目&#xff1a;一个在线教育平台&#xff0c;并创内容管理系统CMS&#xff08;Content Management System&…...

Hadoop高可用搭建(二)

目录 解压Hadoop 改名 更改配置文件 workers hdfs-site.xml core-site.xml hadoop-env.sh mapred-site.xml yarn-site.xml 设置环境变量 启动集群 启动zk集群 启动journalnode服务 格式化hfds namenode 启动namenode 同步namenode信息 查看namenode节点状态 …...

如何用企微SCRM管理系统发掘老客户的新增长点?

如何用企微SCRM管理系统发掘老客户的新增长点&#xff1f; 一直做投放拉新&#xff0c;很快营销成本会难以支撑&#xff0c;如果在私域运营中始终留不下老用户&#xff0c;那么运营也是失败的。 开发老客户的成本只需新客户成本的1/6&#xff0c;但很多企业对老客户都忽视了&…...

我用python疯狂爬取公司数据

我是半路从一个纯小白学过来的&#xff0c;学习途中也掉过许多坑&#xff0c;在这里建议新手要先把基础打扎实&#xff0c;然后再去学习自己需要的内容&#xff0c;不要想着全部学完再用&#xff0c;那样你是永远学不完的&#xff0c;用哪方面就学习哪方面的内容&#xff0c;不…...

EMR集群运行TPC-DS在云盘和OSS中的对比

1.简介 TPC-DS是大数据领域最为知名的Benchmark标准。本文介绍使用阿里云EMR集群运行TPC-DS在云盘和OSS中的表现对比。 2.环境准备 1.创建EEMR-5.10.1集群 1个master,2个core,3台机器都s是4c16g。 2.安装Git和Maven sudo yum install -y git maven3.下载TPC-DS Benchmark工…...

菜鸟在 windows 下 python 中安装 jupyter 踩坑要点 、被神化的 VsCode

我平时用不到 python &#xff0c;更没用过 jupyter &#xff0c;因此我的 python知识仅限于知道有 python 这么个编程语言&#xff0c;会写个 print("Hello World!!!") 而已&#xff0c;完全没听过 jupyter &#xff0c;因为某些原因今天需要安装下 jupyter 看看&am…...

k8s简单搭建

前言 最近学习k8s&#xff0c;跟着网上各种教程搭建了简单的版本&#xff0c;一个master节点&#xff0c;两个node节点&#xff0c;这里记录下防止以后忘记。 具体步骤 准备环境 用Oracle VM VirtualBox虚拟机软件安装3台虚拟机&#xff0c;一台master节点&#xff0c;两台…...

计算机SCI期刊审稿人,一般关注论文的那些问题? - 易智编译EaseEditing

编辑主要关心&#xff1a; &#xff08;1&#xff09;文章内容是否具有足够的创新性&#xff1f; &#xff08;2&#xff09;文章主题是否符合期刊的受众读者&#xff1f; &#xff08;3&#xff09;文章方法学是否合理&#xff0c;数据处理是否充分&#xff1f; &#xff08;…...

Docker迁移以及环境变量问题

问题一描述将docker容器通过docker export命令打包&#xff0c;传输到另外的服务器&#xff0c;再通过docker import命令导入后&#xff0c;发现原来docker容器中的环境变量失效了。解决方案1. 【无效方案】直接在docker容器中通过export命令设置环境变量。export LD_LIBRARY_P…...

Sphinx文档生成工具(二)

rst语法 官方的语法手册 行内的样式&#xff1a; #斜体 *message* #粗体 **message** #等宽 不能有换行 message标题 一级标题 ^^^^^^^^ 二级标题 --------- 三级标题 >>>>>>>>> 四级标题 ::::::::: 五级标题六级标题 """"…...

Python快速上手系列--JSON--入门篇

本章我们来看看json的一些应用。简单易懂还实用。一起来看看数据类型以及一些语法规则吧1、数字&#xff08;整数或浮点数&#xff09; 如&#xff1a;{"age":18, "score":70.5} 注意&#xff0c;数字直接写&#xff0c;不需要带任何符号2、字符串&#xf…...

axios中的GET POST PUT PATCH,发送请求时params和data的区别

axios 中 get/post请求方式 1. 前言 最近突然发现post请求可以使用params方式传值&#xff0c;然后想总结一下其中的用法。 2.1 分类 经过查阅资料&#xff0c;get请求是可以通过body传输数据的&#xff0c;但是许多工具类并不支持此功能。 在postman中&#xff0c;选择get请…...

hume项目k8s的改造

hume项目k8s的改造 一、修改构建目录结构 1、在根目录下添加build-work文件夹 目录结构如下 [rootk8s-worker-01 build-work]# tree . . ├── Dockerfile ├── hume │ └── start.sh └── Jenkinsfile2、每个文件内容如下 Dockerfile FROM ccr.ccs.tencentyun…...

MACD红二波选股公式,选出MACD二次翻红的标的

经过一段上涨行情之后&#xff0c;市场出现了时间稍长或者幅度稍大的调整&#xff0c;MACD指标的DIF、DEA会出现死叉&#xff0c;柱线由红色转变为绿色。 而调整时间较短或者幅度较小&#xff0c;MACD红柱会缩短&#xff0c;但不出现绿柱&#xff0c;之后红柱开始变长&#xff…...

mac上安装mysql

mac上安装mysql1. 关于Linux上安装mysql2. 下载安装2.1 下载2.2 安装3. 客户端连接mysql3.1 先查看mysql服务3.2 连接mysql客户端3.2.1 终端使用命令连接3.2.2 可视化工具连接3.3 其他简单操作&#xff08;启动服务等&#xff09;3.3.1 可视化界面操作4. 配置环境变量4.1 配置环…...

Django 模型继承问题

文章目录Django 模型继承问题继承出现的情况Meta 和多表继承Meta 和多表继承继承与反向关系指定父类连接字段代理模型QuerySet 仍会返回请求的模型基类约束代理模型管理器代理继承和未托管的模型间的区别多重继承不能用字段名 "hiding"在一个包中管理模型Django 模型…...

Vue3篇.01-简介及基本使用,项目创建方式, 模板语法, 事件监听, 修饰符

一.简介1.概念Vue 是一款用于构建用户界面的 JS框架&#xff0c; 基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c; 高效地开发用户界面。渐进式框架&#xff0c; 适应不同需求进行开发。两个核心功能&#xff1a;声明式…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...