详细分析Guava库中的注解@VisibleForTesting,用于标记提醒私有(附Demo)

目录

  • 前言
  • 1. 基本知识
  • 2. Demo

前言

对于Java基本知识推荐阅读:

  1. java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
  2. 【Java项目】实战CRUD的功能整理(持续更新)

从实战中学习:

在这里插入图片描述

源码如下:

在这里插入图片描述

1. 基本知识

@VisibleForTesting 是 Guava 库中的一个注解,用来标记那些原本应该具有较低可见性(如 private 或 protected)的方法或字段,只是为了测试的目的被提升为 public 或 package-private(包级可见)

这种做法可以帮助开发者在编写单元测试时暴露一些只在测试中使用的代码,而不必改变代码的正常结构和设计

主要目的是为了让代码在单元测试时能够访问本应保持私有的字段或方法。
设计意图:暴露的代码仅用于测试,而不是用于实际业务逻辑。它提醒其他开发人员,暴露方法或字段可能会带来设计上的问题,仅在测试代码中使用

2. Demo

一个类 Calculator,包含一个 private 方法,用来计算某个特定值的平方根

在单元测试中直接测试该方法,但不想暴露该方法给生产代码。可以使用 @VisibleForTesting 来标记这个方法

mvn的仓库:https://mvnrepository.com/

先引入pom依赖:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>33.3.1-jre</version>
</dependency>
import com.google.common.annotations.VisibleForTesting;public class Calculator {private int value;public Calculator(int value) {this.value = value;}// 这是一个私有方法,原本不应该公开,但为了测试方便,我们使用 @VisibleForTesting 来暴露它@VisibleForTestingint calculateSquareRoot(int number) {if (number < 0) {throw new IllegalArgumentException("Number must be non-negative");}return (int) Math.sqrt(number);}public int getValue() {return value;}
}

单元测试代码:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;public class CalculatorTest {@Testpublic void testCalculateSquareRoot() {// 创建 Calculator 对象Calculator calculator = new Calculator(25);// 调用 calculateSquareRoot 方法,验证它的行为int result = calculator.calculateSquareRoot(16);System.out.println(result);// 验证结果是否正确assertEquals(4, result, "Square root of 16 should be 4");// 验证负数输入时抛出异常assertThrows(IllegalArgumentException.class, () -> calculator.calculateSquareRoot(-1),"Negative numbers should throw an exception");}
}

截图如下:

在这里插入图片描述

总的来说:

@VisibleForTesting 注解标记了 calculateSquareRoot 方法,表明这个方法虽然是 private,但它是为了测试而暴露的

这样做的好处是:

  • 可读性:其他开发者看到这个注解后,会知道这个方法不应该在生产环境中公开,只是为了单元测试暴露出来的
  • 防止误用:提醒开发人员,暴露的方法不应被正常的生产代码调用,只是在测试环境中使用

使用时要注意,并不是一种强制机制,而是一个提示标志
真正的可见性控制依然由访问修饰符(如 private、protected)来实现,@VisibleForTesting 只是对开发者的提醒

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

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

相关文章

Ubuntu 22.04.5 配置vlan子接口和网桥

使用bond为物理接口&#xff0c;bond配置可以参考&#xff1a;https://blog.csdn.net/qq_50247813/article/details/143630081 实验一、配置vlan子接口 创建bond0&#xff0c;模式为802.3ad&#xff1b;从网卡&#xff0c;ens37&#xff0c;ens38&#xff0c;添加子接口 bond0.…

Hadoop(YARN)

文章目录 YARN基础架构YARN工作原理YARN调度器和调度算法先进先出调度器容量调度器公平调度器 YARN常用命令 YARN基础架构 YARN是Hadoop集群的资源管理和调度系统&#xff0c;它负责为各种分布式计算任务分配和管理资源,包含以下组件&#xff1a;ResourceManager&#xff0c;N…

【GoWeb示例】通过示例学习 Go 的 Web 编程

文章目录 你好世界HTTP 服务器路由&#xff08;使用 gorilla/mux&#xff09;连接到 MySQL 数据库MySQL 数据库简单操作模板静态资源和文件操作表单处理中间件&#xff08;基础&#xff09;中间件&#xff08;高级&#xff09;会话JSONWebsockets密码哈希 你好世界 Go语言创建…

【C语言】Union

一.Union的用法 1.什么是Union? union 共用体名{ 成员列表 }; union&#xff0c;“联合体、共用体”&#xff0c;在某种程度上类似结构体struct的一种数据结构&#xff0c;共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。 2.为什么使用union&#xff1…

2024最新版JavaScript逆向爬虫教程-------基础篇之Chrome开发者工具学习

目录 一、打开Chrome DevTools的三种方式二、Elements元素面板三、Console控制台面板四、Sources面板五、Network面板六、Application面板七、逆向调试技巧7.1 善用搜索7.2 查看请求调用堆栈7.3 XHR 请求断点7.4 Console 插桩7.5 堆内存函数调用7.6 复制Console面板输出 工欲善…

Debezium日常分享系列之:异步 Debezium 嵌入式引擎

Debezium日常分享系列之&#xff1a;异步 Debezium 嵌入式引擎 动机目标非目标保留Kafka Connect模型计划的更改线程池并行运行源任务存储偏移量并发处理CDC事件禁用CDC事件的完全排序自定义记录处理器并行处理记录的选项存储偏移量引擎状态和生命周期防止资源泄漏异常处理退出…

大数据学习12之HBase

1.基本概念 1.1简介 Apache HBase&#xff08;Hadoop DataBase&#xff09;是一个开源的、高可靠性、高性能、面向列&#xff08;这里指列族&#xff0c;非列式存储&#xff09;、可伸缩、实时读写的分布式数据库&#xff0c;其设计思想来源于 Google 的 BigTable 论文。利用 …

POP3、SMTP、FTP、HTTP、BGP、DNS、DHCP、RIP、Ping、Traceroute

POP3 全称&#xff1a;Post Office Protocol 3&#xff0c;即邮局协议第3版。 作用&#xff1a;主要用于电子邮件系统中从邮件服务器检索电子邮件至本地客户端应用程序。它是互联网中最传统的邮件接收协议之一。 工作方式&#xff1a;允许用户通过客户端软件&#xff08;如Ou…

vue之组件网站(后续补)

vue移动端 Vant 4 NutUI cube-ui vue电脑端 Element Plus OpenTiny Arco Design Ant Design Vue Vuetify Naive UI react移动端 Ant Design NutUI react vant

(Go基础)Go的运行流程步骤与包的概念

1. 快速入门 所有的go开发&#xff0c;都必须存在并包含在某一个包内 .go 是go语言程序的后缀名 1.1 编译 通过使用 go build 命令对该go文件进行编译&#xff0c;生成.exe文件 1.2 运行 运行刚刚生成出来的test.exe文件既可&#xff0c;不过并不不是双击&#xff0c;而是在…

Verilog基础知识-逻辑值

在 Verilog 中&#xff0c;逻辑值用于表示数字电路中的状态。 逻辑值 0 &#xff1a;0 表示低电平&#xff1b;1&#xff1a; 1 表示高电平&#xff1b;高阻态&#xff08;High-Z 或 Z&#xff09;&#xff1a;表示一个未驱动&#xff08;undriven&#xff09;或浮空&#xf…

一七六、CSS 介绍及示例

CSS 介绍及示例 CSS&#xff08;Cascading Style Sheets&#xff09;是层叠样式表的缩写&#xff0c;主要用于控制网页元素的样式&#xff0c;如颜色、字体、布局等。以下是常见的 CSS 属性及其示例。 Box 模型相关属性 1. width / height 用于设置元素的宽度和高度。 div …

CSS教程(八)- 盒子模型

1、介绍 核心内容 盒子模型、浮动和定位&#xff0c;帮助我们实现页面布局 本质&#xff1a;页面布局过程 准备好相关的页面元素&#xff0c;网页元素基本都是盒子 Box 利用 CSS 设置盒子的样式&#xff0c;摆放到相应的位置 向盒子中填充相应内容 网页布局的核心本质&…

数据结构——二叉树和BST

树与二叉树 基本概念 树是一种非线性结构&#xff0c;其严格的数学定义是&#xff1a;如果一组数据中除了第一个节点&#xff08;第一个节点称为根节点&#xff0c;没有直接前驱节点&#xff09;之外&#xff0c;其余任意节点有且仅有一个直接前驱&#xff0c;有零个或多个直接…

mysql数据库(四)单表查询

单表查询 文章目录 单表查询一、单表查询1.1 简单查询1.2where1.3group by1.4having1.5order by1.6limit 一、单表查询 记录的查询语法如下&#xff1a; SELECT DISTINCT(去重) 字段1,字段2… FROM 表名 WHERE 筛选条件 GROUP BY 分组 HAVING 分组筛选 ORDER BY 排序 LIMIT 限…

常用机器人算法原理介绍

一、引言 随着科技的不断发展&#xff0c;机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心&#xff0c;它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理&#xff0c;包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

Vagrant 没了 VirtualBox 的话可以配 Qemu

开源虚拟机软件 VirtualBox 从当初不可一世的 Sun 易手到 Oracle 之间&#xff0c;变得不那么被许多公司信任了。之前一直是用 Vagrant 搭配 VirtualBox 在 Mac 下使用 Linux 虚拟机&#xff0c;因为不需要用到 Linux 桌面&#xff0c;用 Vagrant 操作虚拟机非常方便。但现在不…

C语言 | Leetcode C语言题解之第542题01矩阵

题目&#xff1a; 题解&#xff1a; /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().*/ type…

一文了解珈和科技在农业遥感领域的服务内容和能力

2020年&#xff0c;农业农村部、中央网信办联合印发了《数字农业农村发展规划&#xff08;2019-2025年&#xff09;》&#xff0c;对数字农业农村建设作出了具体部署。其中&#xff0c;农业遥感作为推进数字农业农村的重要力量贯穿《规划》始终。 今年10月&#xff0c;农业农村…

【Golang】Channel的ring buffer实现

文章目录 前言一、介绍三、环形缓冲区的实现原理三、使用方式四、总结 前言 在并发编程中&#xff0c;channel 是 Golang 提供的一种用于 goroutine 之间通信的机制。channel 的底层实现是一个环形缓冲区&#xff0c;这种设计使得 channel 在处理大量数据传输时能够保持高效。…