Administrator
发布于 2026-01-13 / 0 阅读
0

Java单元测试

Java单元测试

Java 中常见的单元测试(一):JUnit 篇

SpringBoot基础(五):集成JUnit5

与老版本JUnit对比

文档

一些使用前的基本概念

测试类和测试方法不需要声明为public

  • 在** JUnit4**中,测试类和测试方法** 必须是public**的,因为JUnit4通过反射机制要求访问公共方法
  • 而** JUnit5**则没有这种要求,测试类和方法的可见性设为** 包级(默认)**足够 JUnit 5 框架执行测试
    • 因为 JUnit 5 本质上是在测试框架内部执行这些测试
    • 包级别的可见性允许同一包内的类访问测试类,而不需要将其暴露为 public

Junit5注解

初始化和结束

JUnit会把带有 @Test 的方法识别为测试方法; 标记为 @BeforeEach 和 @AfterEach 的方法,它们会在运行每个 @Test 方法前后自动运行;

JUnit还提供了 @BeforeAll 和 @AfterAll ,它们在运行所有@Test前后运行; @BeforeAll 和 @AfterAll 也只能标注在静态方法上;

  • 对于实例变量,在 @BeforeEach 中初始化,在 @AfterEach 中清理,它们在各个 @Test 方法中互不影响,因为是不同的实例;
  • 对于静态变量,在 @BeforeAll 中初始化,在 @AfterAll 中清理,它们在各个 @Test 方法中均是唯一实例,会影响各个 @Test 方法

@Disabled

排出某些 @Test 方法,不要让它运行,这时,我们就可以给它标记一个 @Disabled;类似 @Disabled 这种注解就称为条件测试,JUnit根据不同的条件注解,决定是否运行当前的 @Test 方法;

为什么我们不直接注释掉 @Test ,而是要加一个 @Disabled ?这是因为注释掉 @Test ,JUnit就不知道这是个测试方法,而加上 @Disabled ,JUnit仍然识别出这是个测试方法,只是暂时不运 行。

JUnit提供了一个 @ParameterizedTest 注解,搭配@ValueSource,用来进行参数化测试。

参数化测试和普通测试稍微不同的地方在于,一个测试方法需要接收至少一个参数,然后,传入一组参数反复运行。

@DisplayName

  • 用于为测试类或测试方法提供一个更具可读性或说明性的** 名称**,便于在测试报告中展示

@RepeatedTest

  • 用于多次** 重复执行**某个测试,可以** 指定重复次数**

常用断言

断言(Assertions)在单元测试中用于** 验证程序行为是否符合预期**。JUnit 提供了一组用于编写断言的方法,断言的使用可以帮助判断测试是否通过。类名** org.junit.jupiter.api.Assertions**

assertEquals(expected, actual)

  • 验证两个对象** 是否相等**
  • 可以用于** 各种数据类型**,包括基本类型、对象等

assertNotEquals(expected, actual)

  • 验证两个对象** 是否不相等**

assertTrue(condition)

  • 验证条件为** true**

assertFalse(condition)

  • 验证条件为** false**

assertNull(actual)

  • 验证对象是否为** null**

assertArrayEquals(expected, actual)

  • 验证两个数组是否相等
  • 数组的** 长度**和元素的** 顺序**都必须相同

assertSame(expected, actual)

  • 验证两个对象引用是否指向** 同一个对象**(即是同一个对象的引用)

fail(message)

  • 强制使测试失败
  • 通常用于标记不应该被执行的代码路径

MockBean