第一个JUnit测试:从零开始写一个能跑的用例
很多新手学单元测试,上来就被各种概念砸晕了。我自己的经验是,先别管什么 Mock、Spring 环境,先把最基础的 JUnit 跑通再说。这节课我们就干一件事——写一个能运行的测试,看看绿色条到底长啥样。
编写你的第一个测试用例
假设我们有一个最普通的计算器类:
public class Calculator {
public int add(int a, int b) {
return a + b;
}
}
写测试前,你要保证项目里已经引入了 JUnit 5 的依赖(Maven 或 Gradle 配置我就不贴了,网上搜一搜就有)。然后新建一个测试类,名字我习惯叫 CalculatorTest,放在与源码相同的包下,但目录要放在 src/test/java 里。
先看代码:
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
void testAdd() {
Calculator calc = new Calculator();
int result = calc.add(2, 3);
assertEquals(5, result, "2 + 3 应该等于 5");
}
}
嗯,就这么简单。你可能会问:为什么要写 @Test?我当年第一次看到这个注解也愣了一下,后来才明白它的作用。
@Test 注解:JUnit 的“开关”
@Test 是 JUnit 5 提供的一个元注解,它的作用只有一个——告诉 JUnit 的测试执行器:“喂,这个方法是个测试方法,运行的时候记得调用它”。
没有 @Test,你写再多方法,JUnit 也不会碰它们。我曾经有个同事,把测试方法写成了 private,还忘了加 @Test,结果折腾了半天发现测试根本没跑。所以这里有几个硬性要求:
- 方法必须是 public(JUnit 5 里包级可访问也可以,但推荐 public)
- 返回值必须是 void
- 不能有参数
注意:JUnit 4 和 JUnit 5 的 @Test 注解来自不同的包。JUnit 4 是 org.junit.Test,JUnit 5 是 org.junit.jupiter.api.Test。别导错了,否则测试会静默忽略。
断言:你凭什么说结果是对的?
测试的核心就是“断言”(Assertion)。说白了就是写个判断语句,如果条件不成立,测试就失败。
JUnit 5 提供了一整套断言方法,放在 org.junit.jupiter.api.Assertions 类里。最常用的我列在下面:
| 断言方法 | 作用 | 示例 |
|---|---|---|
assertEquals(expected, actual) | 判断两个值是否相等 | assertEquals(5, result) |
assertTrue(condition) | 判断条件为 true | assertTrue(list.isEmpty()) |
assertFalse(condition) | 判断条件为 false | assertFalse(flag) |
assertNotNull(object) | 判断对象不为 null | assertNotNull(user) |
assertThrows(exceptionClass, executable) | 判断是否抛出指定异常 | assertThrows(IllegalArgumentException.class, () -> calc.divide(1,0)) |
每个断言方法都支持最后一个参数传入一个 String 作为失败时的提示信息。我个人习惯都会加上,这样测试失败时一眼就能看出问题在哪。
@Test
void testWithMessage() {
Calculator calc = new Calculator();
assertEquals(5, calc.add(2, 3),
"期望值是 5,但实际结果是 " + calc.add(2, 3));
}
小技巧:断言里尽量不要写复杂的逻辑表达式,比如 assertTrue(list.size() > 0 && list.get(0) != null)。一旦失败,你只知道条件不成立,但不知道具体哪一段有问题。拆成多个断言,每个只验证一件事。
运行你的测试:看那条绿条有多爽
在 IntelliJ IDEA 或 Eclipse 里,你可以在测试类或方法上右键 -> Run 'testAdd()'。IDE 会帮你启动 JUnit 运行器,然后你会看到:
- 绿色条:全部通过,完美!
- 红色条:有测试失败,双击错误信息定位到具体断言。
如果用 Maven 命令行:mvn test,会在终端输出测试报告。我当年第一次看到满屏的绿色通过,心里那个舒坦——比改完 bug 还爽。
一句话总结流程:创建测试类 → 加 @Test 注解 → 写断言 → 运行 → 看结果。后面所有的复杂测试,都是这个模型的变种。
看到这里,你已经掌握了单元测试最基本的“三件套”——写测试类、加注解、用断言。接下来的章节我们会深入 Mockito,但请记住:不管框架多花哨,最终判断对错的,还是那一个个简单的断言。