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: ��Ч��Ŀ�귢�а�: 17 ��: javac <options> <source files> -help �����г&a…...
Vue使用Three.js加载glb (gltf) 文件模型及实现简单的选中高亮、测距、测面积
安装: # three.jsnpm install --save three 附中文网: 5. gltf不同文件形式(.glb) | Three.js中文网 附官网: 安装 – three.js docs 完整代码(简易demo): <template><div class"siteInspe…...
<el-table>右侧有空白列解决办法
问题如图: 解决办法:.box 为本页面最外层的class名,保证各个页面样式不会互相污染。 .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 字节,4bit 表示最大的数字是 15, 因此 IP 头部最大长度是 60 字节. 8 位服务类型(Type Of Service):…...
系统讨论Qt的并发编程——逻辑上下文的分类
目录 前言 首先,讨论Qt里常见的三种上下文 同一线程的串行执行 同一线程的异步执行 多线程的执行 moveToThread办法 前言 笔者最近看了一个具备一定启发性质的Qt教程,在这里,笔者打算整理一下自己的笔记。分享在这里. 首先,…...
《Linux Shell 脚本深度探索:原理与高效编程》
1. 基本结构 Shebang 行 #!/bin/bash # Shebang 行指定了脚本使用的解释器。 /bin/bash 表示使用 Bash 解释器执行脚本。 注释 # 这是注释,不会被执行 2. 变量 定义变量 variable_namevalue # 不需要加 $ 来定义变量。 # 变量名不能包含空格或特殊字符。 访…...
深入剖析:基于红黑树实现自定义 map 和 set 容器
🌟 快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。🌟 在 C 标准模板库(STL)的大家庭里,map和set可是超级重要的关联容器成员呢😎&#x…...
在大数据项目中如何设计和优化数据模型
在大数据项目中,设计和优化数据模型是一个涉及多个步骤和维度的复杂过程。以下是我通常采取的方法: 一、数据模型设计 明确业务需求: 深入了解项目的业务场景和目标,明确数据模型需要解决的具体问题。与业务团队紧密合作…...
JavaScript querySelector()、querySelectorAll() CSS选择器解析(DOM元素选择)
文章目录 基于querySelector系列方法的CSS选择器深度解析一、方法概述二、基础选择器类型1. 类型选择器2. ID选择器3. 类选择器4. 属性选择器 三、组合选择器1. 后代组合器2. 子元素组合器3. 相邻兄弟组合器4. 通用兄弟组合器 四、伪类与伪元素1. 结构伪类2. 状态伪类3. 内容伪…...
Linux系统中处理子进程的终止问题
1. 理解子进程终止的机制 在Unix/Linux系统中,当子进程终止时,会向父进程发送一个SIGCHLD信号。父进程需要捕捉这个信号,并通过调用wait()或waitpid()等函数来回收子进程的资源。这一过程被称为“回收僵尸进程”。 如果父进程没有及时调用w…...
Docker 不再难懂:快速掌握容器命令与架构原理
1. Docker 是容器技术的一种 容器(Container)概述 容器(Container)是一种轻量级的虚拟化技术,它将应用程序及其所有依赖环境打包在一个独立的、可移植的运行时环境中。容器通过操作系统级的虚拟化提供隔离࿰…...
取消票证会把指定的票证从数据库中删除,同时也会把票证和航班 等相关表中的关联关系一起删除。但在删除之前,它会先检查当前用户是否拥有这张票
在做航班智能客服问答系统时会遇到取消票证的场景,这里涉及数据库的操作时会把指定的票证从数据库中删除,同时也会把票证和航班等相关表中的关联关系一起删除。但在删除之前,需要先检查当前用户是否拥有这张票,只有票主才有权限取…...
力扣-贪心-763 划分字母区间
思路 先统计字符串中每一个字母出现的最后下标,然后从end初始化为第一个字母出现的最后下标,在i<end时,不断更新end,因为一旦囊括新的字母就最起码要遍历到新字母出现的最后下标,在i>end时,说明遍历…...
【Redis 原理】网络模型
文章目录 用户空间 && 内核空间阻塞IO非阻塞IO信号驱动IO异步IOIO多路复用selectpollepoll Web服务流程Redis 网络模型Redis单线程网络模型的整个流程Redis多线程网络模型的整个流程 用户空间 && 内核空间 为了避免用户应用导致冲突甚至内核崩溃,用…...
cpp中的继承
一、继承概念 在cpp中,封装、继承、多态是面向对象的三大特性。这里的继承就是允许已经存在的类(也就是基类)的基础上创建新类(派生类或者子类),从而实现代码的复用。 如上图所示,Person是基类&…...
DeepSeek全栈接入指南:从零到生产环境的深度实践
第一章:DeepSeek技术体系全景解析 1.1 认知DeepSeek技术生态 DeepSeek作为新一代人工智能技术平台,构建了覆盖算法开发、模型训练、服务部署的全链路技术栈。其核心能力体现在: 1.1.1 多模态智能引擎 自然语言处理:支持文本生成(NLG)、语义理解(NLU)、情感分析等计算…...
CSS 真的会阻塞文档解析吗?
在网页开发领域,一个常见的疑问是 CSS 是否会阻塞文档解析。理解这一问题对于优化网页性能、提升用户体验至关重要。要深入解答这个问题,需要从浏览器渲染网页的原理说起。 浏览器渲染网页的基本流程 浏览器在接收到 HTML 文档后,会依次进行…...
大模型的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 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
【分享】推荐一些办公小工具
1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
