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

embedded/2024/11/14 4:30:44/

目录

  • 前言
  • 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.ppmy.cn/embedded/136950.html

相关文章

【韩老师零基础30天学会Java 】06章 数组、排序和查找

第六章 数组、排序和查找 1. 数组&#x1f6a9;&#x1f6a9; 数组介绍&#xff1a; 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。即:数组就是一组数据。 示例&#xff1a; double [] hens{3,5,1,3,4,2,50,7.8,88.8,1.1,5}; double totalWe…

ENSP作业——园区网

题目 根据上图&#xff0c;可得需求为&#xff1a; 1.配置交换机上的VLAN及IP地址。 2.设置SW1为VLAN 2/3的主根桥&#xff0c;设置SW2为VLAN 20/30的主根桥&#xff0c;且两台交换机互为主备。 3.可以使用super vlan。&#xff08;本次实验中未使用&#xff09; 4.上层通过静…

基于开源AI智能名片2+1链动模式S2B2C商城小程序源码的连环消费链条优化研究

摘要&#xff1a;随着电子商务的快速发展&#xff0c;如何提高顾客的复购率成为了商家关注的焦点。本文通过对开源AI智能名片21链动模式S2B2C商城小程序源码的研究&#xff0c;探讨了如何利用自动化促销模式构建连环消费链条&#xff0c;从而不断刺激顾客复购。本文首先介绍了连…

【大数据学习 | HBASE高级】region split机制和策略

1. region split机制 ​ HRegionServer拆分region的步骤是&#xff0c;先将该region下线&#xff0c;然后拆分&#xff0c;将其子region加入到hbase:meta表中&#xff0c;再将他们加入到原本的HRegionServer中&#xff0c;最后汇报Master。 split前&#xff1a;hbase:meta表有…

React 源码学习01 ---- React.Children.map 的实现与应用

1. 使用方法 React.Children.map(children, function[(thisArg)])2. 方法解释 在 children 里的每个直接子节点上调用一个函数&#xff0c;并将 this 设置为 thisArg。如果 children 是一个数组&#xff0c;它将被遍历并为数组中的每个子节点调用该函数。如果子节点为 null 或…

【Linux】常用命令(2.6万字汇总)

文章目录 Linux常用命令汇总1. 基础知识1.1. Linux系统命令行的含义1.2. 命令的组成 2. 基础知识2.1. 关闭系统2.2. 关闭重启2.3. 帮助命令&#xff08;help&#xff09;2.4. 命令说明书&#xff08;man&#xff09;2.5. 切换用户&#xff08;su&#xff09;2.6.历史指令 3.目录…

【LeetCode】【算法】33. 搜索旋转排序数组

LeetCode 33. 搜索旋转排序数组 题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k…

【测试】【Debug】pytest运行后print没有输出

import pytest def test_good():for i in range(1000):print(i)def test_bad():print(this should fail!)assert False比如上述程序&#xff0c;运行之后只能看到输出了’this should fail!&#xff1b;但是debug版的测试运行后又能看到test_good函数中的输出。 这是为什么呢&a…