目录
- 前言
- 1. 基本知识
- 2. Demo
前言
对于Java基本知识推荐阅读:
- java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)
- 【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 只是对开发者的提醒