Java单元测试
一些使用前的基本概念
测试类和测试方法不需要声明为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)
- 强制使测试失败
- 通常用于标记不应该被执行的代码路径