aaa原则要求测试分三步:arrange只初始化、act只调用被测方法、assert只验证结果,三者隔离清晰、结构分明、命名规范、无冗余逻辑。

遵守 AAA 原则不靠死记硬背,而在于每次写测试时有意识地分三步走:先搭环境、再跑逻辑、最后核对结果。重点是让这三步彼此隔离、一目了然。
Arrange 阶段:只做初始化,不碰被测逻辑
这个阶段只负责“把舞台搭好”,包括创建被测对象、准备输入数据、配置 Mock 依赖、设置初始状态。不能调用被测方法,也不能做任何断言。
- 用变量名体现用途,比如 calculator、validInput、mockRepository
- 避免在 Arrange 里写业务判断,例如不要出现
if (x > 0) {...} - 如果多个测试共用相同初始化,可提取为
@BeforeEach方法,但要确保它只做 setup,不带副作用
Act 阶段:只调一次被测方法,不加额外处理
这是唯一执行被测代码的地方,必须干净、聚焦。哪怕只有一行,也要单独成段,和前后用空行隔开。
- 调用目标方法后,把返回值或捕获的异常明确赋给一个变量,如 result 或 thrown
- 不要在这个阶段做日志、转换、二次计算——那些属于被测逻辑或 Assert 的干扰项
- 如果被测方法抛异常,用
assertThrows()包裹调用,这也算 Act 的一部分
Assert 阶段:只验证,不修改、不重算
这里只关心“结果对不对”,用断言语句检查 result、状态变更、异常类型或交互行为(如 verify mock 调用)。
- 每个测试建议只设一个核心断言;若需多点校验,用
assertAll()组织,保持语义清晰 - 断言信息要具体,比如
assertEquals(5, result, "2+3 应返回 5"),失败时能快速定位 - 避免在 Assert 里重新调用被测方法或构造新对象——那会模糊“验证什么”的边界
视觉与结构上的小习惯,很管用
AAA 不只是逻辑划分,更是阅读体验。实际编码中加点小约束,团队协作时省力很多。
- 三个阶段之间空一行,不加注释也能看懂结构
- 不写
// Arrange这类标签式注释——代码本身该说清意图 - 测试方法名直白表达场景,如 add_returnsSumForPositiveNumbers,和 AAA 步骤天然呼应
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











