JUnit单元测试
# 1. JUnit 单元测试
# 测试分类
- 黑盒测试:不需要写代码,只关注输入和期望输出。
- 白盒测试:需要写代码,关注程序内部执行流程。
# JUnit 使用(白盒测试)
# 步骤
定义一个测试类(建议命名为 被测试类名Test,如 CalculatorTest)
包结构建议放在 xxx.xxx.xxx.test 下,如:cn.itcast.test
定义测试方法:
- 方法名:testXXX() 形式
- 返回值:void
- 参数列表:空参
使用 @Test 注解标记测试方法
导入 JUnit 依赖环境
# 判定结果
- 红色:测试失败
- 绿色:测试成功
- 使用断言进行结果判断:
Assert.assertEquals(期望结果, 实际结果);
# 补充注解
- @Before:测试方法前执行
- @After:测试方法后执行
# 2. 反射:框架设计的灵魂
# 什么是反射?
将类的各个组成部分封装为对象的机制
# 反射的优点
- 程序运行时动态操作对象
- 解耦,提高扩展性
# 获取 Class 对象的方式
1. Class.forName("全类名") // 常用于配置文件加载类
2. 类名.class // 常用于参数传递
3. 对象.getClass() // 通过对象获取类
✅ 同一个类在一次程序运行中只会加载一次,Class 对象是唯一的。
# Class 类的常用方法
# 1. 获取成员变量(Field)
Field[] getFields()
Field getField(String name)
Field[] getDeclaredFields()
Field getDeclaredField(String name)
# 2. 获取构造方法(Constructor)
Constructor<?>[] getConstructors()
Constructor<T> getConstructor(参数类型...)
Constructor<T> getDeclaredConstructor(参数类型...)
Constructor<?>[] getDeclaredConstructors()
# 3. 获取成员方法(Method)
Method[] getMethods()
Method getMethod(String name, 参数类型...)
Method[] getDeclaredMethods()
Method getDeclaredMethod(String name, 参数类型...)
# 4. 获取类名
String getName()
# Field 类操作
field.set(Object obj, Object value); // 设置值
field.get(Object obj); // 获取值
field.setAccessible(true); // 忽略访问权限(暴力反射)
# Constructor 类操作
Constructor.newInstance(Object... args); // 创建对象
clazz.newInstance(); // 简化空参构造创建
# Method 类操作
method.invoke(Object obj, Object... args); // 执行方法
method.getName(); // 获取方法名
# 案例:简单“框架”实现
目标:不改动类代码,通过配置和反射创建对象、执行方法
# 实现步骤
- 配置文件:定义类名、方法名
- 程序读取配置文件
- 反射加载类
- 创建对象
- 执行方法
# 3. 注解(Annotation)
# 注解 vs 注释
- 注解:给计算机看的(说明程序)
- 注释:给程序员看的(描述程序)
# 注解概念
- JDK 1.5+ 新特性
- 可用于:类、方法、字段、参数、局部变量等前面
- 使用方式:@注解名
# 注解的作用分类
- 编写文档:配合 Javadoc
- 代码分析:配合反射
- 编译检查:如 @Override
# 常见的 JDK 注解
- @Override:方法必须来自父类/接口
- @Deprecated:标识方法过时
- @SuppressWarnings("all"):压制所有警告
# 自定义注解
# 定义格式
// 元注解 + 自定义注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "default";
int number();
}
# 属性类型
- 基本类型、String、枚举、注解、以上类型的数组
# 使用规则
- 如果属性名是 value,可以省略名字直接写值
- 数组赋值时用 {} 包裹,只有一个元素可省略
# 元注解(描述注解的注解)
| 元注解 | 说明 |
|---|---|
| @Target | 注解作用位置(类、方法、字段) |
| @Retention | 注解生命周期(SOURCE / CLASS / RUNTIME) |
| @Documented | 是否包含在 Javadoc 中 |
| @Inherited | 是否被子类继承 |
# 注解解析过程
- 获取对象:Class、Method、Field
- 使用 getAnnotation(Class) 获取注解
- 调用注解中的方法,获取值
# 注解案例:模拟简单测试框架
通过注解标识要执行的方法,在运行时用反射动态调用。
上次更新: 2025/07/23, 01:37:33