单元测试原则之——不要模拟不属于你的类型

在单元测试中,不要模拟不属于你的类型(Don’t mock types you don’t own)是一个重要的原则。这是因为外部库或框架的类型(如第三方依赖)可能会在未来的版本中发生变化,而你的模拟可能无法反映这些变化,从而导致测试失效。

以下是一个基于Java Mockito 的示例,展示如何避免模拟不属于你的类型,以及如何使用抽象或接口来隔离外部依赖。


示例场景

假设我们有一个服务类 NotificationService,它依赖于一个外部库 ExternalEmailClient 来发送电子邮件。ExternalEmailClient 是一个第三方类,我们无法直接控制或修改它。

源代码
// 第三方库类(不属于我们的代码)<

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透(杂项集合) --- 中的多协议与漏洞利用技术(杂项知识点 重点) 持续更新

目录 1. NetBIOS 名称的网络协议在局域网中内网渗透中起到什么作用 2. 使用 UDP 端口耗尽技术强制所有 DNS 查找失败&#xff0c;这个技术如何应用在局域网内网渗透测试中 3. 在本地创建一个 HTTP 服务来伪造 WPAD 服务器 什么是 WPAD 服务器&#xff1f;这个服务器是干嘛的…

Git相关笔记1 - 本地文件上传远程仓库

Git相关笔记 目录 Git相关笔记Git上传相关文件第一步创建一个仓库&#xff1a;第二步本地创建空文件夹&#xff1a;第三步开始在gitbush上传文件&#xff1a;解决外网网络连接的问题&#xff1a;中文文件的编码问题&#xff1a;参考资料 Git上传相关文件 第一步创建一个仓库&a…

Cocos Creator 进行 Web 发布后,目录结构解析

在使用 Cocos Creator 进行 Web 发布后&#xff0c;生成的目录结构通常包含以下内容&#xff0c;下面为你详细介绍&#xff1a; 1. index.html 这是 Web 项目的入口 HTML 文件&#xff0c;它会加载所需的 JavaScript 文件和资源&#xff0c;从而启动游戏或应用程序。示例代码…

C++20的协程简介

C20 引入了协程&#xff08;Coroutines&#xff09;&#xff0c;这是一种特殊的函数&#xff0c;它可以暂停执行并在之后恢复&#xff0c;而不是像普通函数那样一旦返回就终止。协程的主要特点在于它能保留自身的执行状态&#xff0c;这让异步编程更加简洁和直观。以下是对 C20…

通过ansible+docker-compose快速安装一主两从redis+三sentinel

目录 示例主机列表 架构参考 文件内容 安装脚本 ansible变量&#xff0c;需修改 ansible配置文件和主机清单&#xff0c;需修改 运行方式 验证故障转移master 涉及redis镜像和完整的脚本文件 示例主机列表 架构参考 文件内容 安装脚本 #!/bin/bashset -e export pa…

Apache Arrow 使用

下述操作参考 Building Arrow C — Apache Arrow v20.0.0.dev267 安装依赖组件 sudo apt-get install \build-essential \ninja-build \cmake 下载源码 git clone --recursive --shallow-submodules gitgithub.com:apache/arrow.git 配置 创建build目录并且进入 mkdir a…

玩转大语言模型——使用华为官方MindIE-Server镜像方式部署DeepSeek模型

系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…

MCP项目开发-一个简单的RAG示例

MCP项目开发-一个简单的RAG示例 前言 前言 客户端是基于官网的例子改的&#xff0c;模型改成了openai库连接仅仅使用基础的RAG流程作为一个演示&#xff0c;包含了以下步骤 query改写搜索&#xff1a;使用google serper重排序&#xff1a;使用硅基流动的api 大模型api也使用…

Tire树(字典树)

理论 上图是一棵Trie树&#xff0c;表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质&#xff1a; 根节点不包含字符&#xff0c;除根节点外的每一个子节点都包含一个字符。从根节点到某一个节点&…

厄瓜多尔主流收单方式:Pago Efectivo支付

PAGOEFECTIVO&#xff08;Pago Efectivo&#xff09;是秘鲁主流的在线支付方式&#xff0c;由El Comercio Group开发&#xff0c;主要为用户提供安全、便捷的在线支付解决方案&#xff0c;支持网银和现金支付&#xff0c;适用于没有信用卡或不愿透露银行信息的消费者。 Pago Ef…

【文献研究】含硼钢中BN表面偏析对可镀性的影响

《B 添加钢的溶融 Zn めっき性に及ぼす BN 表面析出の影響》由JFE公司田原大輔等人撰写。研究聚焦 B 添加钢在低露点退火时 BN 形成对镀锌性的影响&#xff0c;对汽车用高强度钢镀锌工艺优化意义重大。通过多组对比实验&#xff0c;结合多种分析手段&#xff0c;明确了相关因素…

语法: ptr=malloc(size)

MALLOC( ) 语法: ptrmalloc(size) 参数: size是一个整数,表示被分配的字节个数; 返回值: 如果允许的话,返回值是一个指向被分配存储器的指针;否则的话, 返回值是一个非指针; 功能: 该函数用来分配一定大小的空间给一个对象,其大小为size,但该空间的值为不确定值; 有…

JavaScript创建对象与构造函数

目录 创建对象 一、创建对象的 5 种核心方式 1. 对象字面量&#xff08;直接量&#xff09; 2. 使用 Object.create() 3. 工厂模式 4. 构造函数模式 5. ES6 class 语法&#xff08;语法糖&#xff09; 二、构造函数与 new 关键字 1. 构造函数的作用 2. 构造函数的特征…

AIDD-人工智能药物设计-深度学习助力提高儿童低级别胶质瘤复发风险预测的准确性

深度学习助力提高儿童低级别胶质瘤复发风险预测的准确性 儿童低级别胶质瘤&#xff08;pLGG&#xff09;是一种常见于儿童患者中的脑肿瘤&#xff0c;尽管大多数时候被认为是良性肿瘤&#xff0c;但是它们仍然可能导致相关症状和并发症的发生&#xff0c;包括但不限于头疼、癫…

redis的数据类型(1)

https://redis.io/docs/latest/develop/data-types/strings/ 社区版支持&#xff1a; String&#xff0c;字符串 Hash&#xff0c;key-value格式 List&#xff0c;根据插入顺序排序 Set&#xff0c;集合 Sorted set&#xff0c;有排序 Stream&#xff0c; Bitmap&#xff0c; …

Nacos配置中心使用

Nacos配置中心 Nacos除了可以做注册中心,&#x1f517;Nacos下载和注册中心教程,同样可以做配置管理来使用。 一、统一配置管理 当微服务部署的实例越来越多&#xff0c;达到数十、数百时&#xff0c;逐个修改微服务配置就显得十分的不方便&#xff0c;而且很容易出错。我们…

OpenCV轮廓检测全面解析:从基础到高级应用

一、概述 轮廓检测是计算机视觉中的基础技术&#xff0c;用于识别和提取图像中物体的边界。与边缘检测不同&#xff0c;轮廓检测更关注将边缘像素连接成有意义的整体&#xff0c;形成封闭的边界。 轮廓检测的核心价值 - 物体识别&#xff1a;通过轮廓可以识别图像中的独立物体…

Jenkins学习(B站教程)

文章目录 1.持续集成CI2.持续交付CD3.持续部署4.持续集成的操作流程5.jenkins简介6.后续安装部署&#xff0c;见视频 bilibili视频 Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具&#xff0c;起源于Hudson&#xff08;Hudson是商用的&#xff09;&#xff0c;主要用…

ARM-UART

时钟选择PLCK,超时3ms自动发送&#xff0c;设置发送8位的缓冲区&#xff0c;且发送中断 设置触发深度&#xff0c;达到8字节将缓冲区数据发憷 中断处理函数

Rust所有权详解

文章目录 Rust所有权所有权规则作用域 内存和分配移动与克隆栈空间堆空间 关于函数的所有权机制作为参数作为返回值 引用与租借垂悬引用 Rust所有权 C/C中我们对于堆内存通常需要自己手动管理&#xff0c;手动申请和释放&#xff0c;即便有了智能指针&#xff0c;对于效率的影…