JUnit 5的框架介绍

下面我来用比较口语化的方式和你聊聊JUnit 5的用法,从导包、简单Demo,到注意事项和一些小技巧,咱们一步步说清楚~


1. 导入依赖(导包)

首先,如果你是用Maven构建项目,就需要在pom.xml里加上JUnit 5的依赖。基本上只需要添加下面这段配置就行(记得scope设为test哦):

xml 复制代码
<dependency>
  <groupId>org.junit.jupiter</groupId>
  <artifactId>junit-jupiter-engine</artifactId>
  <version>5.8.2</version>
  <scope>test</scope>
</dependency>

这样Maven就会自动下载JUnit 5相关的jar包。除了这个,如果你需要参数化测试,还可以加上junit-jupiter-params依赖~

citeturn0search2


2. 编写Demo

咱们写个简单的单元测试来验证一个方法。假设你有个类叫HelloWorld,它有个方法sayHello()返回一个字符串。你可以这么写测试类:

java 复制代码
import org.junit.jupiter.api.*;

class HelloWorldTest {

    @BeforeAll
    static void initAll() {
        System.out.println("所有测试开始前的初始化...");
    }

    @BeforeEach
    void init() {
        System.out.println("每个测试前的准备工作...");
    }

    @DisplayName("测试 sayHello 方法")
    @Test
    void testSayHello() {
        HelloWorld hw = new HelloWorld();
        String result = hw.sayHello();
        // 使用断言来检查返回结果是否符合预期
        Assertions.assertEquals("Hello, world!", result);
    }

    @AfterEach
    void tearDown() {
        System.out.println("每个测试结束后的清理工作...");
    }

    @AfterAll
    static void tearDownAll() {
        System.out.println("所有测试结束后的清理工作...");
    }
}

这里几个注解的意思简单说一下:

  • @BeforeAll@AfterAll:分别在所有测试开始前和结束后只运行一次(记得它们必须是静态方法)。
  • @BeforeEach@AfterEach:每个测试方法执行前后各执行一次。
  • @DisplayName:可以给测试类或方法自定义一个更友好的名字,这样在测试报告里看起来更清晰。
  • @Test :标记一个方法为测试方法。
    citeturn0search0
    在JUnit 5里,有个好处就是测试方法和类不用非得写成public,这和之前JUnit 4有点区别,写成包级私有也OK。

3. 注意事项

在使用JUnit 5时,有几点小细节需要注意:

  • 测试方法必须是无参且返回void。如果有参数了(除非你用参数化测试),JUnit 5会报错。
  • @BeforeAll 和 @AfterAll方法一定要是static,否则运行时会出错。
  • 测试方法不需要public修饰符 ,包级可见就够了。这点可以减少一些不必要的暴露~
    citeturn0search5
  • 如果你不想某个测试执行,可以加上**@Disabled**注解,这样JUnit在跑测试时就会跳过它。
  • 尽量写有意义的断言 。使用Assertions提供的断言方法(比如assertEqualsassertTrue等),而不要仅仅依赖打印信息来判断测试结果。

4. 使用技巧

除了基本用法之外,还有一些小技巧可以帮助你写出更好、更高效的测试代码:

  • 参数化测试 :用@ParameterizedTest配合@ValueSource@CsvSource等可以让同一个测试方法跑多个数据组合。例如:

    java 复制代码
    @ParameterizedTest
    @ValueSource(ints = {2, 4, 6})
    void testEvenNumbers(int num) {
        Assertions.assertEquals(0, num % 2);
    }

    这样就不用写多个类似的方法啦。

    citeturn0search8

  • 重复测试 :如果需要重复执行某个测试方法,可以用@RepeatedTest。例如:

    java 复制代码
    @RepeatedTest(3)
    void repeatedTest() {
        System.out.println("这个测试会执行三次");
    }
  • 分组断言 :使用assertAll可以把多个断言放在一块执行,这样即使有个别断言失败,也能把所有失败信息都显示出来,方便调试。例如:

    java 复制代码
    @Test
    void groupAssertions() {
        int[] nums = {0, 1, 2, 3};
        Assertions.assertAll("检查数组各项",
            () -> Assertions.assertEquals(0, nums[0]),
            () -> Assertions.assertEquals(1, nums[1]),
            () -> Assertions.assertEquals(2, nums[2])
        );
    }
  • 动态测试 :JUnit 5还支持动态生成测试案例,通过@TestFactory返回一组DynamicTest,这对于测试一些运行时数据生成的场景非常有用。

  • 使用Lambda表达式 :在断言消息里使用Lambda表达式可以延迟构造消息,有助于性能优化,尤其是当构造断言信息比较耗时时。

    citeturn0search4


小结

简单来说,JUnit 5让单元测试变得更灵活、更现代化。咱们只需要:

  • 在项目中导入JUnit 5依赖(比如用Maven配置)。
  • 编写测试类,利用注解(@Test、@BeforeAll、@DisplayName等)来组织测试代码。
  • 注意测试方法的格式(无参、void、非public也OK)。
  • 掌握参数化测试、重复测试、分组断言等技巧,让测试代码更高效、更易读。

这样你就能写出既稳健又便于维护的单元测试啦!希望这些讲解对你有帮助~


参考资料:

citeturn0search0

citeturn0search8

citeturn0search9

相关推荐
她的男孩8 分钟前
多租户和数据权限怎么共存?扒完拦截器注册链路,我找到 4 个隐蔽的坑
java·后端·架构
用户83562907805111 分钟前
使用 Python 设置 Excel 页眉和页脚
后端·python
步行cgn14 分钟前
IoC 控制反转:从概念到 Spring 的实现
后端
爱勇宝29 分钟前
没有 Fn 键关触控板?我做了一个双击即用的 Windows 小工具
前端·后端·程序员
沙湖遇雨1 小时前
8.ByteBuf 的数据模型、生命周期和内存分配
后端
by组态1 小时前
Ricon组态系统API参考手册
前端·后端·物联网
再吃一根胡萝卜1 小时前
Agent 如何选择与生成 SQL —— Text2SQL 全链路详解
后端
苍何1 小时前
把操作流程直接录成 Skill,豆包太夯了!
后端