自定义注解+反射可实现类junit4的简易测试框架:定义@test/@before/@after等runtime级方法注解,通过反射扫描、实例化、按序调用并捕获assertionerror统一判别失败。

Java 中可以通过自定义注解 + 反射 + 测试执行器,实现一个简易但功能完整的单元测试驱动框架,原理与 JUnit 4 高度相似(JUnit 5 已转向基于引擎的架构,但核心思想仍相通)。
定义测试相关注解
先创建几个关键注解,用 @Retention(RetentionPolicy.RUNTIME) 和 @Target(ElementType.METHOD) 声明,确保运行时可通过反射读取:
- @Test:标记测试方法(无参数、无返回值、非静态、public)
- @Before:标记每个测试方法执行前运行的方法(常用于初始化)
- @After:标记每个测试方法执行后运行的方法(常用于清理)
- @Ignore(可选):跳过该测试方法
示例:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Test { }
编写测试执行器(Runner)
核心是写一个工具类(如 SimpleTestRunner),它接收测试类 Class 对象,完成以下步骤:
- 扫描所有 public 方法,找出被
@Test标记的方法 - 查找可选的
@Before和@After方法(每个类最多一个,且签名合法) - 对每个
@Test方法:实例化测试类 → 调用@Before(若存在)→ 调用测试方法 → 调用@After(若存在)→ 捕获异常并记录结果 - 统计通过/失败数,打印简要报告
注意:需用 Method.setAccessible(true) 绕过 private 访问限制(JUnit 4 也如此);异常处理要区分断言失败(如手动 throw new AssertionError)和运行时异常。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
支持基本断言(可选但实用)
不必复刻 AssertJ 或 JUnit 的全部断言,自己写一个轻量 Assert 工具类即可:
-
assertTrue(boolean condition, String message):条件为 false 时抛AssertionError -
assertEquals(Object expected, Object actual):调用equals比较,不等则报错 - 所有断言失败都抛出
AssertionError,便于 Runner 统一识别为“测试失败”而非“崩溃”
这样测试方法里就能写 Assert.assertEquals("hello", str);,Runner 捕获 AssertionError 后记为 fail,其余异常记为 error。
运行方式:main 方法或构建插件集成
最简单方式是在测试类外写个 main:
public class TestRunnerMain {
public static void main(String[] args) {
SimpleTestRunner.run(MyTestClass.class);
}
}
进阶可对接 Maven Surefire 插件(需实现 org.apache.maven.surefire.provider.api.Provider),但对学习目的而言,手动调用已足够揭示 JUnit 的本质——它不是魔法,只是规范 + 反射 + 控制流编排。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










