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

SpringBootTest Mockito 虚实结合编写测试

SpringBootTest & Mockito 虚实结合测试

起因

单一使用mockito,会出现很多mock困难的问题,导致测试编写过程太长,太恶心
单一使用springboottest,会遇到需要外部接口的地方,这个时候就非得去真实调用才行。也很恶心
所以 想到了混合使用 ,这个方法非原创,纯记录,以下的内容都是自己真实的

常用注解

注解使用时机
@MockBean全部都走mock
@SpyBean除特殊指定mock外,都执行真实方法

示例

import cn.hutool.core.util.RandomUtil;
import com.xxxx.util.exception.ServiceException;
import com.xxxx.xxx.common.core.entity.user.xxxxConfig;
import com.xxxx.xxx.common.core.utils.SecurityUtils;
import com.xxxx.xxx.common.mybatis.mapper.userMapper;
import com.xxxx.xxx.user.dto.xxxxDTO;
import com.xxxx.xxx.user.service.xxxxConfigService;
import com.xxxx.xxx.user.vo.xxxxVO;
import com.xxxx.xxx.verify.code.service.xxxxService;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.annotation.Rollback;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;@Transactional
@SpringBootTest
@Rollback
// 当模块中存在websocket的时候,需要使用下方注解配置,方可启动成功(以下配置会启动服务)
// @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
class XxxxConfigServiceImplTest {@Resourceprivate XxxxConfigService xxxxConfigService;@MockBean(name = "userMapper")private UserMapper myUserMapper;@Resourceprivate XxxxService xxxxService;public static final String ACCOUNT = RandomUtil.randomString(8);public static final String TEL = RandomUtil.randomNumbers(11);@BeforeEachvoid init() {// mock方法返回Mockito.when(myUserMapper.selectTelByAccount(Mockito.anyString())).thenReturn(TEL);}@Test@DisplayName("修改:成功")void update() {// 以下都是执行真实代码xxxxDTO xxDTO = new xxxxDTO();xxDTO.setAccount(ACCOUNT);xxDTO.setPassword("123456");xxDTO.setStartTime("00:00");xxDTO.setEndTime("23:59");xxDTO.setCaptchaCode("0000");xxxxConfigService.sendCode(ACCOUNT);xxxxConfigService.update(xxDTO);xxxxConfig controlConfig = xxxxConfigService.lambdaQuery().eq(xxxxConfig::getAccount, ACCOUNT).one();assert controlConfig.getAccount().equals(xxDTO.getAccount());assert controlConfig.getStartTime().equals(xxDTO.getStartTime());assert controlConfig.getEndTime().equals(xxDTO.getEndTime());}
}

常见问题

  • MockBean导致启动失败,提示 org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type ‘xxx’
    解决方法:
       // 属性名换一个 myUserMapper@MockBean(name = "userMapper")private UserMapper myUserMapper;
    

相关文章:

SpringBootTest Mockito 虚实结合编写测试

SpringBootTest & Mockito 虚实结合测试 起因 单一使用mockito,会出现很多mock困难的问题,导致测试编写过程太长,太恶心 单一使用springboottest,会遇到需要外部接口的地方,这个时候就非得去真实调用才行。也很恶…...

国内外网络安全政策动态(2024年9月)

国内网络安全政策动态 ▶︎ 1.三项智能网联汽车强制性国家标准正式发布 9月4日,工业和信息化部组织制定的GB 44495—2024《汽车整车信息安全技术要求》、GB 44496—2024《汽车软件升级通用技术要求》和GB 44497—2024《智能网联汽车 自动驾驶数据记录系统》三项强制…...

使用Android studio进行Unit Test中遇到的问题记录

1、模块本身代码运行不起来 提示: Cannot resolve method ‘getVolumes’ in ‘StorageManager’ Cannot resolve method ‘registerListener’ in ‘StorageManager’ Cannot resolve method ‘unregisterListener’ in ‘StorageManager’ 查看Android 源码&…...

智能运维与问题诊断工具:提升生产环境的安全稳定性

引言 在当今复杂的IT环境中,确保生产系统的安全稳定运行是一项巨大挑战。随着技术的进步,智能运维和问题诊断工具应运而生,为IT团队提供了强大的支持。本文将介绍一系列先进的工具,这些工具利用人工智能、机器学习和自动化技术,帮助组织提高系统可靠性、加速问题解决、优…...

【MAUI】CommunityToolkit社区工具包介绍

一、为什么需要声明式开发 .NET的MVVM,始于WPF,很古典,它甚至可能是现代前端框架“声明式开发”的鼻祖。声明式开发,之所以出现,是因为命令式开发在UI层和代码层上无法解耦的问题。如下图所示: 1、命令式开发:后台代码需要调用UI层的控件(label.Text),如果更新UI层…...

【答疑解惑】图文深入详解undo和redo的区别及其底层逻辑

题记:最近有些人问我,undo和redo到底是什么关系,他们中不乏已经入行3-4年的同学,今天咱们就来深入探讨下到底什么是undo和redo,他们分别做什么,底层逻辑原理是什么等等。 1. undo 1.1 undo的存储结构 Un…...

低通滤波、反相放大器电路

1 简介 这种可调低通滤波、反相放大器电路可将信号电平放大 26dB 或 20V/V。R2 和 C1 会为此电路设置截止频率。此电路的频率响应与无源 RC 滤波器的相同,除非输出按放大器的通带增益进行放大。低通滤波器通常用于音频信号链,此滤波器有时也称为低音增强…...

SpringBoot助力服装生产流程优化

1 绪论 1.1 研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制,不仅提高了工作效率,而且大大的提高…...

【机器学习】线性回归算法简介 及 数学实现方法

线性回归 简介 利用 回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关系进行建模的一种分析方式。 数学公式: ℎ_(w) w_1x_1 w_2x_2 w_3x_3 … b w^Txb 概念 ​ 利用回归方程(函数) 对 一个或多个自变量(特征值)和因变量(目标值)之间 关…...

设计模式的学习

OO:Object-Oriented 面向对象 --- 《Head First设计模式》 这本书是用java写的,我是写C的,用C来写相关的代码 --- p2(第二页) #ifndef DUCK_H #define DUCK_H/*** brief The Duck class 鸭子类*/ class Duck { public:D…...

wordpress发邮件SMTP服务器配置步骤指南?

wordpress发邮件功能如何优化?怎么用wordpress发信? 由于WordPress默认的邮件发送功能可能不够稳定,配置SMTP服务器成为了许多网站管理员的选择。AokSend将详细介绍如何在WordPress中配置SMTP服务器,以确保邮件能够顺利发送。 w…...

胤娲科技:机械臂「叛逃」记——自由游走,再悄然合体

夜深人静,你正沉浸在梦乡的前奏,突然意识到房间的灯还亮着。此刻的你,是否幻想过有一只无形的手,轻盈地飘过,帮你熄灭那盏碍眼的灯? 又或者,你正窝在沙发上,享受电视剧的紧张刺激&am…...

分布式事务讲解 - 2PC、3PC、TCC

分布式事务讲解 - 2PC、3PC、TCC 前置知识 BASE理论: BASE是Basically Availbale(基本可用)、Soft state(软状态)、Eventually consistent(最终一致性)三个词语的缩写。BASE理论是对CAP理论中AP的一个扩展,通过牺牲强一致性来获得可用性,当…...

前端基础面试题·第四篇——Vue(其二)

1.Vue中路由传参 1.params传参 params 传参是通过URL路径来传递参数,这种方式传递的参数是必选的。这种传参方式需要在路由配置时在路由路径位置提前指定参数。 路由配置 const router new VueRouter({routes: [{path: /user/:id, // 这里的:id就是参数name: u…...

PHP反射

文章目录 介绍基本用法基本的反射示例1. 反射类2. 反射方法3. 反射属性4.反射全局函数5.反射函数的参数 优势和注意事项优势:注意事项: 介绍 PHP反射是一种强大的机制,允许在运行时检查类、接口、方法、属性等的结构和元数据。它可以用于许多…...

Gated Transformer Networks for Multivariate Time Series Classification

博客贡献人 徐宁 作者 Minghao Liu , Shengqi Ren , Siyuan Ma , Jiahui Jiao , Yizhou Chen , Zhiguang Wang(Facebook AI) and Wei Song∗ 标签 多元时间序列分类,Transformer,门控 摘要 用于时间序列分类的深度学习模型(主要是卷积网…...

这一次,AI真的能帮你实现职场跃迁

你有没有想过: AI不仅能帮你实现工作提效 还能帮你实现职场跃迁! 根据行业报告,近年来**AIGC(AI Generated Content)**领域岗位数量井喷式增长,AI大模型产品经理作为连接技术与市场的桥梁,正扮…...

Python绘制--绘制心形曲线

今天,我们将通过Python代码来绘制一个心形曲线,这是一个经典的数学表达。 一、心形曲线的数学原理 心形曲线,也被称为心脏曲线,是一个代数曲线,可以通过参数方程定义。其数学表达式如下: x16sin⁡3(t)x16…...

初识Linux · 自主Shell编写

目录 前言: 1 命令行解释器部分 2 获取用户命令行参数 3 命令行参数进行分割 4 执行命令 5 判断命令是否为内建命令 前言: 本文介绍是自主Shell编写,对于shell,即外壳解释程序,我们目前接触到的命令行解释器&am…...

海报设计模板免费的好用吗?活动海报排版技巧轻松get

虽然今年所有的法定节假日已经过完了,但对于电商打工族来说,需要制作活动海报的节日,还有很多吧...... 刚听到小道消息,说是今年的双十一,从十月十四号就开始预热了! 怎么样,大家的预热活动海…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...