JUnit单元测试
2025/7/21大约 3 分钟《JavaWeb》笔记JavaWebJUnitJavaServletJSPJDBCWeb开发HTTP
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) 获取注解
- 调用注解中的方法,获取值
注解案例:模拟简单测试框架
通过注解标识要执行的方法,在运行时用反射动态调用。
