单元测试入门和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()) {
    @Mock
    public 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

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946028.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开发小工具:ping地址

开发小工具&#xff1a;ping地址 import socketdef tcp_port_scan(ip,port):#创建套接字socksocket.socket(socket.AF_INET,socket.SOCK_STREAM)#设置超时sock.settimeout(0.2)try:#发请求result sock.connect_ex((ip,port))if result 0:print(f{ip}--{port}接口连接成功)res…

双汇火腿肠,请勿随意喂猫

在许多家庭中&#xff0c;猫咪作为可爱的宠物成员&#xff0c;备受宠爱。当我们享受着双汇火腿肠的便捷与美味时&#xff0c;或许会有人想到与猫咪分享&#xff0c;但这种看似温馨的举动实则隐藏着诸多问题&#xff0c;双汇火腿肠并不适合喂猫。 从营养成分来看&#xff0c;双…

Unity Excel转Json编辑器工具

功能说明&#xff1a;根据 .xlsx 文件生成对应的 JSON 文件&#xff0c;并自动创建脚本 注意事项 Excel 读取依赖 本功能依赖 EPPlus 库&#xff0c;只能读取 .xlsx 文件。请确保将该脚本放置在 Assets 目录下的 Editor 文件夹中。同时&#xff0c;在 Editor 下再创建一个 Exc…

深信服云桌面系统的终端安全准入设置

深信服的云桌面系统在默认状态下没有终端的安全准入设置&#xff0c;这也意味着同样的虚拟机&#xff0c;使用云桌面终端或者桌面套件都可以登录&#xff0c;但这也给系统带来了一些安全隐患&#xff0c;所以&#xff0c;一般情况下需要设置终端的安全准入策略&#xff0c;防止…

基于SpringBoot的实验室信息管理系统【源码+文档+部署讲解】

系统介绍 视频演示 基于SpringBootVue实现的实验室信息管理系统采用前后端分离的架构方式&#xff0c;系统分为管理员、老师、用户三种角色&#xff0c;实现了用户管理、设备管理、实验室查询、公告、课程、实验室耗材管理、我的等功能 技术选型 开发工具&#xff1a;idea2…

Windows 10 自带功能实现大屏、小屏无线扩展

一、添加可选功能 在作为无线投屏对象的「第二屏」设备上&#xff0c;打开 Windows 10 设置并定位至「应用 > 应用和功能」界面&#xff0c;然后点击右侧界面中的「可选功能」选项。 点击可选功能界面顶部的「添加功能」按钮&#xff0c;搜索「无线显示器」模块并选择添加。…

大电流和大电压采样电路

大电压采样电路&#xff1a; 需要串联多个电阻进行分压&#xff0c;从而一级一级降低电压&#xff0c;防止电阻损坏或者短路直接打穿MCU。 为什么需要加电压跟随器&#xff1a;进行阻抗的隔离&#xff0c;防止MCU的IO阻抗对分压产生影响&#xff1a; 大电流检测电路&#xff…

torch.nn.functional的用法

文章目录 介绍激活函数示例 损失函数示例 卷积操作示例 池化示例 归一化操作示例 Dropout示例 torch.nn.functional 与 torch.nn 的区别 介绍 torch.nn.functional 是 PyTorch 中的一个模块&#xff0c;提供了许多函数式的神经网络操作&#xff0c;包括激活函数、损失函数、卷…

生物信息学软件开发综述学习

目录 ①编程语言和开源工具和库 ②轻量级 R 包开发 ③大规模组学软件开发 ④示例 1.轻量级 R 包开发示例及数据 2.大规模组学软件开发 文献&#xff1a;Bioinformatics software development: Principles and future directions ①编程语言和开源工具和库 在生物信息学…

【复刻】数字化转型是否赋能企业新质生产力发展?(2015-2023年)

参照赵国庆&#xff08;2024&#xff09;的做法&#xff0c;对来自产业经济评论《企业数字化转型是否赋能企业新质生产力发展——基于中国上市企业的微观证据》一文中的基准回归部分进行复刻基于2015-2023年中国A股上市公司数据&#xff0c;实证分析企业数字化转型对新质生产力…

在线免费批量生成 Word 文档工具

为了方便的批量生成 Word 文档&#xff0c;写了个在线 Word 文档批量生成工具&#xff0c;可以根据 Excel 数据和 Word 模板批量生成大量个性化的 Word 文档。适用于需要批量生成格式统一但内容不同的文档场景。比如&#xff1a; 批量生成证书、奖状批量生成合同、协议批量生成…

3D数学基础2

矩阵的行列式 在任意方阵中都存在至少一个标量&#xff0c;称作该方阵的行列式。在线性代数中&#xff0c;行列式有很多有用的性质 线性运算法则 方阵 M M M的行列式记作 ∣ M ∣ |M| ∣M∣或“det M”。非方阵矩阵的行列式是未定义的。 注意&#xff0c;在书写行列式时&…

2024国产化信创产品名录

文章目录 一、JDK/OpenJDK替代品1、龙芯JDK2、阿里巴巴Dragonwell3、毕昇JDK4、腾讯 Kona 二、Tomcat替代品1、东方通TongWeb2、宝兰德Web服务器软件3、普元信息Primeton AppServer4、金蝶天燕AAS应用服务器 三、Nginx替代品1、宝兰德WebServer2、东方通TongHttpServer3、Tengi…

OpenCV-Python实战(11)——边缘检测

一、Sobel 算子 通过 X 梯度核与 Y 梯度核求得图像在&#xff0c;水平与垂直方向的梯度。 img cv2.Sobel(src*,ddepth*,dx*,dy*,ksize*,scale*,delta*,borderType*)img&#xff1a;目标图像。 src&#xff1a;原始图像。 ddepth&#xff1a;目标图像深度&#xff0c;-1 代表…

基于微博热搜评论的情感分析与热点主题挖掘研究

目录 1、绪论 1.1 研究背景与研究意义 1.2 数据来源 1.3 技术路线 2、数据预处理 2.1 数据清洗与准备 2.2 导入必要库与加载数据 2.3 加载停用词表与分词处理 2.4 统计词频与高频词分析 3、情感分析与主题建模 3.1 情感分析 3.2 主题建模 3.3 热点主题识别 4、数据可视…

【毕业设计选题】目标检测方向毕业设计选题推荐 2025

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

Windows onnxruntime编译openvino

理论上来说&#xff0c;可以直接访问 ONNXRuntime Releases 下载 dll 文件&#xff0c;然后从官方文档中下载缺少的头文件以直接调用&#xff0c;但我没有尝试过。 1. 下载 OpenVINO 包 从官网下载 OpenVINO 的安装包并放置在 C:\Program Files (x86) 路径下&#xff0c;例如…

PCB设计检查助手——焊盘中间丝印检查

焊盘中间丝印检查功能用于检查双引脚元件中间是否有垂直两个焊盘连线的元件&#xff0c;由于较大双贴片引脚不用考虑中间的丝印&#xff0c;在检查时会自动过滤两个引脚大于1mm以上的元件&#xff0c;此功能在检查时&#xff0c;两个引脚的间距小于等于1mm&#xff0c;且元件的…

LiteFlow 流程引擎引入Spring boot项目集成pg数据库

文章目录 官网地址简要项目引入maven 所需jar包配置 PostgreSQL 数据库表使用LiteFlow配置 yml 文件通过 代码方式使用 liteflow数据库sql 数据在流程中周转 官网地址 https://liteflow.cc/ 简要 如果你要对复杂业务逻辑进行新写或者重构&#xff0c;用LiteFlow最合适不过。…

MATLAB学习-1 蚁群算法解决TSP问题

matlab安装可以在网上找一个安装教程,我安装的是R2020a版本的。 学习解决该问题 利用蚁群算法对给定的TSP问题进行求解,求出一条最短路径。 用的是194个城市的TSPLIB数据集,如果需要TSPLIB数据集可点击 tsp、添加了可视化,迭代400次,目前最短路径为10576.5454,实现效果如…