导入
@BeforeEach 和 @AfterEach 注解
本课程演示了使用 @BeforeEach 和 @AfterEach 注解的两个生命周期方法的工作原理。
@Test 和构造函数
在 JUnit 5 中,每个测试都会创建测试类的一个新实例。例如,如果一个类中有两个 @Test 方法,则会为每个测试创建一个测试类的实例。因此,测试类的构造函数将被调用的次数等于 @Test 方法的数量。让我们通过一个示例来观察:
1package io.educative.junit5; 2 3import org.junit.jupiter.api.Test; 4 5public class LifecycleTest { 6 7 public LifecycleTest() { 8 System.out.println("LifecycleTest - 构造函数已执行 !!!"); 9 } 10 11 @Test 12 public void testOne() { 13 System.out.println("LifecycleTest - testOne() 已执行 !!!"); 14 } 15 16 @Test 17 public void testTwo() { 18 System.out.println("LifecycleTest - testTwo() 已执行 !!!"); 19 } 20}
从输出结果可以看出,构造函数被调用了两次,因为存在两个被 @Test 注解的方法。这证明了每个测试都在独立的测试类实例中运行。
@BeforeEach 和 @AfterEach
被 @BeforeEach 和 @AfterEach 注解的方法,顾名思义,会在每个 @Test 方法执行前和执行后各调用一次。因此,如果一个测试类中有两个 @Test 方法,那么 @BeforeEach 方法将被调用两次(每次测试前各一次),同样地,@AfterEach 方法也会被调用两次(每次测试后各一次)。我们继续使用之前的测试类进行演示:
1package io.educative.junit5; 2 3import org.junit.jupiter.api.AfterEach; 4import org.junit.jupiter.api.BeforeEach; 5import org.junit.jupiter.api.Test; 6 7public class LifecycleTest { 8 9 public LifecycleTest() { 10 System.out.println("LifecycleTest - 构造函数已执行 !!!"); 11 } 12 13 @BeforeEach 14 public void beforeEach() { 15 System.out.println("LifecycleTest - beforeEach() 已执行 !!!"); 16 } 17 18 @Test 19 public void testOne() { 20 System.out.println("LifecycleTest - testOne() 已执行 !!!"); 21 } 22 23 @Test 24 public void testTwo() { 25 System.out.println("LifecycleTest - testTwo() 已执行 !!!"); 26 } 27 28 @AfterEach 29 public void afterEach() { 30 System.out.println("LifecycleTest - afterEach() 已执行 !!!"); 31 } 32}
由于 JUnit 测试类包含两个 @Test 方法,每个测试方法都会在独立的测试类实例中执行。系统会先选中其中一个 @Test 方法(默认执行顺序是确定的,但对使用者不可预期),然后按以下顺序执行:
- 通过调用构造函数初始化测试类。
- 接着执行
@BeforeEach注解的方法。 - 然后执行
@Test方法。 - 再执行
@AfterEach注解的方法。 - 接着选择第二个
@Test方法,重复步骤 1 到 4。
通常情况下,当多个测试用例需要共享相同的初始化逻辑时,我们会将公共的初始化代码放在 @BeforeEach 注解的方法中,而清理工作则放在 @AfterEach 注解的方法中。
在下一课中,我们将学习 @BeforeAll() 和 @AfterAll 生命周期回调方法。