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

Junit+Mock

base project

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/></parent><dependencies><!--添加mysql依赖--><dependency><groupId>org.mariadb.jdbc</groupId><artifactId>mariadb-java-client</artifactId><version>2.7.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><!--单元测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!--junit4--><dependency><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
</dependencies>

application.yaml

server:port: 8896spring:datasource:username: rootpassword: rooturl: jdbc:mariadb://local_IP_replace:3306/junit?serverTimezone=GMT%2B8&useSSL=false&allowPublicKeyRetrieval=truedriver-class-name: org.mariadb.jdbc.Driver

controller

@RestController
@RequestMapping("/ele")
public class EleController {private final IEleService eleService;@Autowiredpublic EleController(IEleService eleService) {this.eleService = eleService;}@GetMapping(value = "/selectEleById")public Result<Object> selectEleById(@RequestParam(value = "orderId") int orderId) {Object object = eleService.selectEleById(orderId);return Result.success(object);}@GetMapping(value = "/selectEleByIdAndName")public Result<Object> selectEleByIdAndName(@RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {Object object = eleService.selectEleByIdAndName(id,name);return Result.success(object);}
}

service

public interface IEleService {Object selectEleById(int orderId);Object selectEleByIdAndName(int id, String name);
}
@Service
public class EleService implements IEleService {@Autowiredprivate IElementsMapper elementsMapper;@Overridepublic Object selectEleById(int orderId) {ElementsDO elementsDO = elementsMapper.selectById(orderId);return elementsDO;}@Overridepublic Object selectEleByIdAndName(int id, String name) {LambdaQueryWrapper<ElementsDO> queryWrapper = new LambdaQueryWrapper<>();queryWrapper.eq(ElementsDO::getId, id);queryWrapper.eq(ElementsDO::getElementName, name);ElementsDO elementsDO = elementsMapper.selectOne(queryWrapper);return elementsDO;}
}

mapper

@Mapper
public interface IElementsMapper extends BaseMapper<ElementsDO> {
}

entity

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@TableName("ELEMENTS")
public class ElementsDO implements Serializable {/*** id*/@TableId(value = "ID", type = IdType.AUTO)private Integer id;/*** 要素代码*/@TableField(value = "ELEMENT_CODE")private String elementCode;/*** 要素名称*/@TableField(value = "ELEMENT_NAME")private String elementName;/*** 单位*/@TableField(value = "UNIT")private String unit;
}

controller返回封装对象

@JsonInclude(JsonInclude.Include.NON_NULL)
public class Result<T> {private int code;private String msg="success";private T data;/***  成功时候的调用* */public static <T> Result<T> success() {Result<T> result = new Result<T>();result.code = 1;return result;}public static<T> Result<T> success(T data){return new Result<T>(data);}/***  失败时候的调用* */public static  <T> Result<T> error(CodeMsg codeMsg){return new Result<T>(codeMsg);}private Result(T data) {this.data = data;}private Result(int code, String msg) {this.code = code;this.msg = msg;}private Result() {}private Result(CodeMsg codeMsg) {if(codeMsg != null) {this.code = codeMsg.getCode();this.msg = codeMsg.getMsg();}}/*** BindingResult统一处理*/public static Result resolveBindResult(BindingResult bindingResult){StringBuilder stringBuilder = new StringBuilder();for (String s : bindingResult.getFieldErrors().stream().map(FieldError::getDefaultMessage).collect(Collectors.toList())) {stringBuilder.append(",").append(s);}return Result.error(new CodeMsg(502,stringBuilder.toString().substring(1)));}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}@Overridepublic String toString() {return "Result [code=" + code + ", msg=" + msg + ", data=" + data + "]";}}

Mock初始化

方式1

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.Spy;
import org.mockito.junit.jupiter.MockitoExtension;@ExtendWith(MockitoExtension.class)
public class Init1 {//初始化模拟对象@Mockprivate EleService eleService;//初始化真实对象@Spyprivate EleService eleService2;@Testpublic void test1(){boolean mock = Mockito.mockingDetails(eleService).isMock();System.out.println(mock);boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();System.out.println(mock1);}
}

方式2

import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init2 {private EleService eleService;//初始化@BeforeEachpublic void init() {eleService = Mockito.mock(EleService.class);}@Testpublic void test1(){//判断对象是否为muck对象boolean mock = Mockito.mockingDetails(eleService).isMock();System.out.println(mock);}
}

方式3

import org.junit.jupiter.api.BeforeEach;
@ExtendWith(MockitoExtension.class)
public class Init3 {//初始化模拟对象@Mockprivate EleService eleService;//初始化真实对象@Spyprivate EleService eleService2;//初始化@BeforeEachpublic void init() {//初始化当前类对象下的相关mockMockitoAnnotations.openMocks(this);}@Testpublic void test1(){boolean mock = Mockito.mockingDetails(eleService).isMock();System.out.println(mock);boolean mock1 = Mockito.mockingDetails(eleService2).isSpy();System.out.println(mock1);}
}

Mock默认返回值

int默认返回0,对象默认返回null,集合默认返回空集合(空的ArrayList、空的HashSet、空的HashMap)

@ExtendWith(MockitoExtension.class)
public class MockMethod1 {//初始化模拟对象@Mockprivate EleService eleService;@Testpublic void test1(){//Mock对象返回默认值,不会调用真正方法Object o1 = eleService.selectEleById(1);//nullSystem.out.println(o1);}
}

Mock参数设置

@ExtendWith(MockitoExtension.class)
public class MockMethod1 {//初始化模拟对象@Mockprivate EleService eleService;@Testpublic void test1(){/*** 插桩,只拦截参数为1*///指定参数为1时,selectEleById方法时返回new Object()Mockito.doReturn(new Object()).when(eleService).selectEleById(1);Object o2 = eleService.selectEleById(1);System.out.println(o2);//java.lang.Object@16b2bb0c}@Testpublic void test2(){/*** 插桩,拦截selectEleById()的任意参数值*/Mockito.doReturn(new Object()).when(eleService).selectEleById(ArgumentMatchers.any(Integer.class));Object o2 = eleService.selectEleById(2);System.out.println(o2);//java.lang.Object@c7045b9}
}

相关文章:

Junit+Mock

base project <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.11</version><relativePath/></parent><dependencies><!--添加mysql依…...

maven编译出错,javac: ��Ч��Ŀ�귢�а�: 17

1、异常信息 javac: &#xfffd;&#xfffd;Ч&#xfffd;&#xfffd;Ŀ&#xfffd;귢&#xfffd;а&#xfffd;: 17 &#xfffd;&#xfffd;: javac <options> <source files> -help &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;г&a…...

Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积

安装&#xff1a; # three.jsnpm install --save three 附中文网&#xff1a; 5. gltf不同文件形式(.glb) | Three.js中文网 附官网&#xff1a; 安装 – three.js docs 完整代码&#xff08;简易demo&#xff09;&#xff1a; <template><div class"siteInspe…...

<el-table>右侧有空白列解决办法

问题如图&#xff1a; 解决办法&#xff1a;.box 为本页面最外层的class名&#xff0c;保证各个页面样式不会互相污染。 .box::v-deep .el-table th.gutter {display: none;width: 0}.box ::v-deep.el-table colgroup col[namegutter] {display: none;width: 0;}.box::v-deep …...

Linux网络 网络层

IP 协议 协议头格式 4 位版本号(version): 指定 IP 协议的版本, 对于 IPv4 来说, 就是 4. 4 位头部长度(header length): IP 头部的长度是多少个 32bit, 也就是 4 字节&#xff0c;4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…...

系统讨论Qt的并发编程——逻辑上下文的分类

目录 前言 首先&#xff0c;讨论Qt里常见的三种上下文 同一线程的串行执行 同一线程的异步执行 多线程的执行 moveToThread办法 前言 笔者最近看了一个具备一定启发性质的Qt教程&#xff0c;在这里&#xff0c;笔者打算整理一下自己的笔记。分享在这里. 首先&#xff0c…...

《Linux Shell 脚本深度探索:原理与高效编程》

1. 基本结构 Shebang 行 #!/bin/bash # Shebang 行指定了脚本使用的解释器。 /bin/bash 表示使用 Bash 解释器执行脚本。 注释 # 这是注释&#xff0c;不会被执行 2. 变量 定义变量 variable_namevalue # 不需要加 $ 来定义变量。 # 变量名不能包含空格或特殊字符。 访…...

深入剖析:基于红黑树实现自定义 map 和 set 容器

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 在 C 标准模板库&#xff08;STL&#xff09;的大家庭里&#xff0c;map和set可是超级重要的关联容器成员呢&#x1f60e;&#x…...

在大数据项目中如何设计和优化数据模型

在大数据项目中&#xff0c;设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法&#xff1a; 一、数据模型设计 明确业务需求&#xff1a; 深入了解项目的业务场景和目标&#xff0c;明确数据模型需要解决的具体问题。与业务团队紧密合作&#xf…...

JavaScript querySelector()、querySelectorAll() CSS选择器解析(DOM元素选择)

文章目录 基于querySelector系列方法的CSS选择器深度解析一、方法概述二、基础选择器类型1. 类型选择器2. ID选择器3. 类选择器4. 属性选择器 三、组合选择器1. 后代组合器2. 子元素组合器3. 相邻兄弟组合器4. 通用兄弟组合器 四、伪类与伪元素1. 结构伪类2. 状态伪类3. 内容伪…...

Linux系统中处理子进程的终止问题

1. 理解子进程终止的机制 在Unix/Linux系统中&#xff0c;当子进程终止时&#xff0c;会向父进程发送一个SIGCHLD信号。父进程需要捕捉这个信号&#xff0c;并通过调用wait()或waitpid()等函数来回收子进程的资源。这一过程被称为“回收僵尸进程”。 如果父进程没有及时调用w…...

Docker 不再难懂:快速掌握容器命令与架构原理

1. Docker 是容器技术的一种 容器&#xff08;Container&#xff09;概述 容器&#xff08;Container&#xff09;是一种轻量级的虚拟化技术&#xff0c;它将应用程序及其所有依赖环境打包在一个独立的、可移植的运行时环境中。容器通过操作系统级的虚拟化提供隔离&#xff0…...

取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票

在做航班智能客服问答系统时会遇到取消票证的场景&#xff0c;这里涉及数据库的操作时会把指定的票证从数据库中删除&#xff0c;同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前&#xff0c;需要先检查当前用户是否拥有这张票&#xff0c;只有票主才有权限取…...

力扣-贪心-763 划分字母区间

思路 先统计字符串中每一个字母出现的最后下标&#xff0c;然后从end初始化为第一个字母出现的最后下标&#xff0c;在i<end时&#xff0c;不断更新end&#xff0c;因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标&#xff0c;在i>end时&#xff0c;说明遍历…...

【Redis 原理】网络模型

文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃&#xff0c;用…...

cpp中的继承

一、继承概念 在cpp中&#xff0c;封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类&#xff08;也就是基类&#xff09;的基础上创建新类&#xff08;派生类或者子类&#xff09;&#xff0c;从而实现代码的复用。 如上图所示&#xff0c;Person是基类&…...

DeepSeek全栈接入指南:从零到生产环境的深度实践

第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...

CSS 真的会阻塞文档解析吗?

在网页开发领域&#xff0c;一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题&#xff0c;需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后&#xff0c;会依次进行…...

大模型的UI自动化:Cline 使用Playwright MCP Server完成测试

大模型的UI自动化:Cline 使用Playwright MCP Server完成测试 MCP MCP(Model Context Protocol),是一个开发的协议,标准化了应用程序如何为大模型提供上下文。MCP提供了一个标准的为LLM提供数据、工具的方式,使用MCP会更容易的构建Agent或者是基于LLM的复杂工作流。 最近…...

碰撞检测 | 图解凸多边形分离轴定理(附ROS C++可视化)

目录 0 专栏介绍1 凸多边形碰撞检测2 多边形判凸算法3 分离轴定理(SAT)4 算法仿真与可视化4.1 核心算法4.2 仿真实验 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff1a;曲线…...

鲜枣去核机(论文 CAD图纸)

鲜枣去核作业长期依赖人工操作&#xff0c;不仅效率低下&#xff0c;还易因操作疲劳导致果肉损伤&#xff0c;影响产品品质。鲜枣去核机的出现&#xff0c;为这一环节提供了高效解决方案。其核心作用在于通过机械结构精准定位枣核位置&#xff0c;利用特定刀具快速分离果核与果…...

如何备份大量小表组成的数据库_并行导出与多文件并发写入.txt

PHP开发无需选机箱&#xff0c;真正关键的是CPU单核性能、RAM容量和SSD读写延迟&#xff1b;生产服务器的硬件选型属于运维范畴&#xff0c;与PHP编码、调试、本地运行无关。PHP 是运行在服务器端的脚本语言&#xff0c;源码开发阶段根本不需要考虑机箱、散热或 PCIe 插槽——这…...

mysql主从配置作业 一主一次

一、环境要求主&#xff1a;192.168.211.138从&#xff1a;192.168.221.139二、配置主1.添加vim /etc/my.cnflog-binmysql-bin server-id12.重启数据库生效systemctl restart mysqld3.建立同步账号【1】创建用来传输数据的账号create user repl192.168.211.% identified by rep…...

别再硬啃理论了!用‘主从博弈’的视角理解Benders分解

主从博弈&#xff1a;用故事思维拆解Benders分解算法 想象一下你是一家跨国公司的CEO&#xff08;主问题&#xff09;&#xff0c;需要决定在哪些国家开设工厂&#xff08;x变量&#xff09;。而每个国家的分公司经理&#xff08;子问题&#xff09;会根据你的决策&#xff0c;…...

Windows服务器运维:如何用mstsc命令和.rdp配置文件打造你的专属远程桌面管理库

Windows服务器高效运维&#xff1a;构建企业级远程桌面管理库的终极指南 每次面对服务器列表里密密麻麻的IP地址时&#xff0c;你是否也经历过这样的崩溃瞬间&#xff1f;临时需要连接某台测试服务器&#xff0c;却记不清具体IP&#xff1b;生产环境紧急维护&#xff0c;手忙脚…...

书匠策AI:期刊论文的“智能魔法棒”,解锁学术新境界

在学术的浩瀚宇宙中&#xff0c;每一位研究者都是探索未知的星辰&#xff0c;而期刊论文则是他们闪耀光芒的舞台。然而&#xff0c;撰写一篇高质量的期刊论文&#xff0c;往往需要经历选题迷茫、文献浩瀚、框架构建、内容雕琢等多重考验。幸运的是&#xff0c;随着人工智能技术…...

TPA626芯片资料(1)

一、芯片介绍1. 概述TPA626是3PEAK&#xff08;思瑞浦&#xff09;生产的一款双向电流和功率监测器芯片&#xff0c;用于精确测量电流、电压和功耗&#xff0c;广泛应用于电源管理、服务器和电信设备等领域。TPA626是一款电流与功率监测器&#xff0c;具备I2C或SMBUS兼容接口。…...

从超市购物车到推荐系统:深入浅出图解FP-Growth算法(附Python实战)

从超市购物车到推荐系统&#xff1a;深入浅出图解FP-Growth算法&#xff08;附Python实战&#xff09; 当你推着购物车在超市里闲逛时&#xff0c;是否想过货架上那些看似随意的商品摆放背后&#xff0c;其实隐藏着精密的数学算法&#xff1f;那些"买了啤酒的顾客也会买尿…...

SVG的DSP程序、FPGA程序、主板原理图及PCB与其他辅助板PCB的相关性

svg的dsp程序 FPGA程序 和主板原理图和pcb&#xff0c;其他辅助板的pcb&#xff0c;辅助板没有原理图 一、代码工程概述与核心定位 本次解析的代码工程来自SVG&#xff08;静止无功发生器&#xff09;的DSP控制模块&#xff0c;基于TI TMS320F28335芯片开发&#xff0c;核心功…...

从单根谱线到频谱搬移:用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异

从单根谱线到频谱搬移&#xff1a;用Matlab的fft/pspectrum搞懂实信号与复信号频谱差异 第一次用Matlab的fft函数画正弦信号频谱时&#xff0c;我盯着屏幕上对称的两根谱线愣了半天——明明只生成了一个频率的正弦波&#xff0c;为什么会出现两根线&#xff1f;直到后来接触复信…...