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

单元测试入门和mockup

Java 新手入门:Java单元测试利器,Mock详解_java mock-CSDN博客

这个是典型的before when assert三段式,学一下单测思路

 这个没有动态代理,所以是直接class(对比下面)

Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new MockUp私有方法-CSDN博客

new mock up:

Jmockit使用@MockUp控制被注入Service的方法_mockup使用教程-CSDN博客

默认方法的含义

在 JMockit 中,当一个类的依赖(如 链接的UserService)被注入时,如果没有为该依赖的某个方法设置具体的行为,JMockit 会提供一个默认实现。这个默认实现通常是:

  1. 对于 返回值类型 的方法:
    • 返回值类型是 int 或其他基本类型时,返回其默认值(如 0false 等)。
    • 返回值类型是对象时,返回 null
  2. 对于 void 方法
    • 不执行任何实际逻辑,相当于一个空实现。

由于 userService 是被 JMockit 模拟的,setUserId 方法的默认实现 不会修改 orderInfouserId 属性。因此:

  • orderInfo.getUserId() 始终为 null

模拟类里面的方法:

方式一:使用new Expectations()

@Test
public void getOrderInfo1() {new Expectations() {{userService.setUserId((OrderInfo) any);result = new Delegate<OrderInfo>() {void delegate(OrderInfo orderInfo) {orderInfo.setUserId("ZHANGSAN123"); // 模拟方法逻辑}};}};OrderInfo result = testService.getOrderInfo("123");// 验证结果Assert.assertEquals("ZHANGSAN123", result.getUserId());
}

这部分代码是 JMockit 的 Expectations 定义,主要用来模拟依赖对象 userService 的行为。

  • userService.setUserId((OrderInfo) any)
    声明当 userServicesetUserId 方法被调用时,不管传入的参数是什么((OrderInfo) any),都会执行后续的行为。

  • result = new Delegate<OrderInfo>()
    为被调用的方法定义了一个代理逻辑(即模拟实现)。这里 Delegate 是 JMockit 提供的功能,用来自定义方法的执行逻辑。

  • 代理逻辑:void delegate(OrderInfo orderInfo)

    • 传入的 orderInfo 对象是调用 setUserId 方法时的参数。
    • 在代理逻辑中,直接对 orderInfouserId 属性赋值为 "ZHANGSAN123"

 

解读:
  • userService.setUserId((OrderInfo) any)
    定义了 userServicesetUserId 方法在接收到任何 OrderInfo 对象作为参数时,会执行以下逻辑。

  • result = new Delegate<OrderInfo>() { ... }
    通过 Delegate 为方法提供了具体的代理逻辑:

    • setUserId 被调用时,不会执行真实的实现,而是执行代理逻辑,直接将 orderInfo.userId 设置为 "ZHANGSAN123"
Expectations 如何影响依赖对象?
示例:

OrderInfo result = testService.getOrderInfo("123");

  1. 依赖方法调用

    • testService.getOrderInfo 会调用 userService.setUserId(orderInfo)
  2. 方法替换

    • 因为用 Expectations 模拟了 setUserId 方法,实际调用的不是 UserService 的真实方法,而是 Expectations 中定义的代理逻辑。
  3. 逻辑执行

    • 在代理逻辑中,将 orderInfo.userId 设置为 "ZHANGSAN123"
  4. 结果返回

    • 通过修改后的 OrderInfo 对象返回给调用方。

基本原理
Expectations 是 JMockit 提供的一种基于 声明式 的方式,用于定义某个依赖对象的方法行为。

  • 通过在测试代码中定义具体的行为,测试框架根据定义的规则动态返回结果或执行逻辑。
  • 对特定实例生效,不影响该类的其他实例。

 

方式2:使用new mockup()推荐:更easy

new MockUp<UserService>(userService.getClass()) {@Mockpublic void setUserId(OrderInfo orderInfo) {orderInfo.setUserId("zhangsan123");}
};

基本原理
MockUp 是 JMockit 提供的一种方式,用于在运行时修改类的方法实现。

  • 可以直接为某个类的具体方法编写新的实现,类似于 重写方法。
  • 使用 @Mock 注解标记需要模拟的方法。

 注意:

/*** @author xinruoxiangyang9010* 这里的参数必须是:userService.getClass()* 如果写成UserService.class则@Mock里面的方法不生效*/
new MockUp<UserService>(userService.getClass())
1. UserService.class
  • 表示类级别的代理
    当你使用 new MockUp<UserService>()new MockUp<UserService>(UserService.class) 时,JMockit 会针对 UserService 类本身 进行代理。
    • 它的效果是全局生效,影响所有实例。
    • 但是,如果在运行时,你注入的是 userService 的一个动态代理对象(比如 Spring 的动态代理机制生成的对象),代理逻辑不会直接生效。
2. userService.getClass()
  • 表示对象所属的动态类型
    userService.getClass() 返回的是 userService 实际运行时的类型。
    • 如果 userService 是被 Spring 动态代理(如 CGLIB 或 JDK 动态代理)生成的对象,那么 userService.getClass() 返回的就是这个动态代理类。
    • MockUp 会针对这个动态代理类生效,从而让 @Mock 标注的方法在调用时起作用。

在实际项目中,特别是使用 Spring 框架时,@Autowired 注入的 userService 很可能是一个动态代理对象,而不是直接的 UserService 实例。 

假设 userService 是通过 Spring 注入的动态代理对象: 

System.out.println(userService.getClass()); // 输出类似 com.example.UserService$$EnhancerBySpringCGLIB$$12345

 

 

 

相关文章:

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…...

蓝桥杯(Java)(ing)

Java前置知识 输入流&#xff1a; &#xff08;在Java面向对象编程-CSDN博客里面有提过相关知识------IO流&#xff09; // 快读快写 static BufferedReader in new BufferedReader(new InputStreamReader(System.in)); static BufferedWriter out new BufferedWriter(new…...

【Linux-多线程】线程互斥(锁和它的接口等)

一、线程互斥 我们把多个线程能够看到的资源叫做共享资源&#xff0c;我们对共享资源进行保护&#xff0c;就是互斥 1.多线程访问问题 【示例】见一见多线程访问问题&#xff0c;下面是一个抢票的代码&#xff0c;共计票数10000张&#xff0c;4个线程去抢 之前我们展示过封…...

[江科大STM32] 第五集快速建立STM32工程模板——笔记

保存&#xff0c;进去选芯片型号&#xff0c;我们是F10C8T6 一个MD&#xff0c;还有所有.c.h 这里所有文件 这里所有文件...

流水线并行举例说明;GPU 的细粒度问题

GPU 的细粒度与模型并行和流水线并行关系 使用模型并行和流水线并行之后会涉及到一个模型切分细粒度的问题,先切分多头(并行执行),每一个多头在切分不同阶段(串行执行)。这种情况下GPU的细粒度是多少 在这种模型并行和流水线并行结合且按多头和阶段切分的情况下,GPU 的…...

如何确保Kafka集群的高可用?

大家好&#xff0c;我是锋哥。今天分享关于【如何确保Kafka集群的高可用&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何确保Kafka集群的高可用&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 要确保 Kafka 集群 的高可用性&#xff0c;需要…...

计算机毕业设计Python+Spark考研预测系统 考研推荐系统 考研数据分析 考研大数据 大数据毕业设计 大数据毕设

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…...

Oracle SqlPlus常用命令简介

参考资料 【SQL*Plus】SETシステム変数の設定前後の具体例 目录 一. 执行系命令1.1 执行系统命令1.2 执行sql脚本文件1.2.1 在数据库中执行sql脚本1.2.2 通过sqlplus执行sql脚本 二. show命令2.1 显示SqlPlus中的全部环境变量2.2 显示指定环境变量的设置 三. 时间显示3.1 set …...

8.若依系统监控与定时任务

帮助开发者和运维快速了解应用程序的性能状态。 数据监控 定时任务 实现动态管理任务。 需求&#xff1a;每间隔5s&#xff0c;控制台输出系统时间。 新建的任务类必须在指定目录ruoyi-quartz模块下的task包下。 状态设置为启动 执行策略 场景&#xff1a;比如一个任务每个…...

《计算机组成及汇编语言原理》阅读笔记:p160-p176

《计算机组成及汇编语言原理》学习第 12 天&#xff0c;p160-p176 总结&#xff0c;总计 17 页。 一、技术总结 1.PowerPC (1)programming model(mode) As in most modern computers, there are at least two separate views of the system (formally called programming m…...

TCP网络编程(三)—— 客户端的编写/服务器端和客户端的通信

上篇文章我们学习了TCP的服务器端模式的编写&#xff0c;这篇文章我们将开始编写客户端的代码&#xff0c;完成服务器端和客户端的通信。完整代码和演示在文章的后面。 和服务器端不同&#xff0c;在客户端我们只需要服务器端的套接字和服务器端的地址和端口&#xff0c;用于向…...

如何在谷歌浏览器中使用自定义模板

作为最常用的网络浏览器之一&#xff0c;谷歌浏览器不仅提供了强大的功能&#xff0c;还允许用户通过各种方式自定义其外观和功能。其中&#xff0c;使用自定义模板可以极大地提升用户体验&#xff0c;无论是更改浏览器的外观还是优化网页显示效果。本文将详细介绍如何在谷歌浏…...

Day2 微服务 网关路由转发、网关登录校验、配置管理

目录 1.网关路由转发 1.1 网关 1.2 快速入门 1.2.1 创建项目 1.2.2 引入依赖 1.2.3 启动类 1.2.4 配置路由 1.2.5 测试 1.3 路由过滤 2.网关登录校验 2.1 鉴权思路分析 2.2 网关过滤器 2.3 自定义过滤器 2.3.1 自定义GatewayFilter 2.3.2 自定义GlobalFilter 2.4 登录校验 2.4.…...

Android 旋转盘导航栏

1.直接上源码&#xff1a; package com.you.arc;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.support…...

空域降噪、频域降噪和时域降噪

目录 算法原理&#xff1a; 1.图像噪声 2.图像中常见的噪声的类型 3.不同域的定义 4.空域降噪 4.1.空域降噪的定义&#xff1a; 4.2.思想核心&#xff1a; 4.3.局部的线性算法 高斯降噪 4.4.非局部算法 5.频域降噪 傅里叶降噪&#xff1a; 小波降噪&#xff1a; …...

Cornerstone3D:了解Nifti文件,并查看元数据

Nifti 全称Neuroimaging Informatics Technology Initiative是一种专为存储医学和神经影像数据而设计的文件格式。设计目的是高效的存储三维或四维图像数据&#xff0c;同时将相关的元数据紧凑地嵌入文件中。Nifti文件的组成&#xff1a;头信息&#xff08;元数据&#xff09;…...

设计模式の状态策略责任链模式

文章目录 前言一、状态模式二、策略模式三、责任链模式 前言 本篇是关于设计模式中的状态模式、策略模式、以及责任链模式的学习笔记。 一、状态模式 状态模式是一种行为设计模式&#xff0c;核心思想在于&#xff0c;使某个对象在其内部状态改变时&#xff0c;改变该对象的行为…...

DevOps流程CICD之Jenkins使用操作

一、jenkins的docker-compose安装部署 请参考 jenkins的docker安装部署配置全网最详细教程-CSDN博客 二、创建repository 三、创建ssh 四、创建视图 五、创建任务 六、配置gitlab钩子 七、自动构建部署CI/CD验证...

【玩转23种Java设计模式】行为型模式篇:备忘录模式

软件设计模式&#xff08;Design pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...

Unity Shader TexelSize的意义

TexelSize在制作玻璃折射效果时会用到。 // Get the normal in tangent space fixed3 bump UnpackNormal(tex2D(_BumpMap, i.uv.zw)); // Compute the offset in tangent space float2 offset bump.xy * _Distortion * _RefractionTex_TexelSize.xy; i.scrPos.xy offset * i…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

保姆级教程:在无网络无显卡的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…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

Spring Security 认证流程——补充

一、认证流程概述 Spring Security 的认证流程基于 过滤器链&#xff08;Filter Chain&#xff09;&#xff0c;核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤&#xff1a; 用户提交登录请求拦…...