第一个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)判断条件为 trueassertTrue(list.isEmpty())
assertFalse(condition)判断条件为 falseassertFalse(flag)
assertNotNull(object)判断对象不为 nullassertNotNull(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 注解 → 写断言 → 运行 → 看结果。后面所有的复杂测试,都是这个模型的变种。

第一个 JUnit 测试核心流程 创建测试类 CalculatorTest 添加 @Test 注解 标记测试方法 编写测试方法 void testXxx() 编写断言 assertEquals / assertTrue 运行测试 IDE 右键 / mvn test 查看结果 绿条 ✅ / 红条 ❌ 关键提醒 方法必须 public void 无参,否则测试被忽略 断言失败时会抛 AssertionFailedError,不会影响其他测试

看到这里,你已经掌握了单元测试最基本的“三件套”——写测试类、加注解、用断言。接下来的章节我们会深入 Mockito,但请记住:不管框架多花哨,最终判断对错的,还是那一个个简单的断言。