Статья поможет вам понять порядок выполнения методов, использующих аннотации, предоставляемые JUnit 5.

Основные аннотации в JUnit 5

  • Перед каждым
  • Преждевсего
  • AfterEach
  • После всего

Перед каждым

Метод с аннотацией BeforeEach выполняется перед каждым тестом. У нас может быть несколько методов BeforeEach, но порядок выполнения не гарантируется.

Это похоже на аннотацию Before в JUnit 4.

AfterEach

Метод с аннотацией AfterEach выполняется после каждого теста. У нас может быть несколько методов AfterEach, но порядок выполнения не гарантируется.

Это похоже на аннотацию After в JUnit 4.

Преждевсего

Метод с аннотацией BeforeAll выполняется один раз перед всеми тестами. Этот метод должен быть статическим.

Это похоже на аннотацию BeforeClass в JUnit 4.

После всего

Метод, аннотированный AfterAll, выполняется один раз после всех тестов. Этот метод должен быть статическим.

Это похоже на аннотацию AfterClass в JUnit 4.

Пример

// example test class
public class TestClass {
 static {
  System.out.println("Static block of Test class");
 }

 public TestClass() {
  System.out.println("Constructor of Test class");
 }

 @BeforeAll
 public static void beforeAll() {
  System.out.println("Before All in Test class");
 }

 @AfterAll
 public static void afterAll() {
  System.out.println("After All in Test class");
 }

 @BeforeEach
 public void beforeEach() {
  System.out.println("Before Each In Test class");
 }

 @AfterEach
 public void afterEach() {
  System.out.println("After Each in Test class");
 }

 @Test
 public void testOne() {
  System.out.println("Test 1 in Test class");
 }
}

/*
Output:

Static block of Test class
Before All in Test class
Constructor of Test class
Before Each In Test class
Test 1 in Test class
After Each in Test class
After All in Test class
*/

Порядок, в котором эти методы запускаются для выполнения теста:

Порядок, в котором запускаются методы, когда тестовый класс расширяет базовый класс:

Хотя я не очень склонен к такому подходу, я видел, как он используется, чтобы избежать дублирования кода для настройки в нескольких тестовых классах.

Следующий пример должен помочь вам понять порядок, в котором эти методы выполняются, когда возникает проблема наследования.

public class ParentClass {
 static {
  System.out.println("Static block of Parent class");
 }

 public ParentClass() {
  System.out.println("Constructor of Parent class");
 }

 @BeforeAll
 public static void beforeAllInParent() {
  System.out.println("Before All in Parent class");
 }

 @AfterAll
 public static void afterAllInParent() {
  System.out.println("After All in Parent class");
 }

 @BeforeEach
 public void beforeEachInParent() {
  System.out.println("Before Each in Parent class");
 }

 @AfterEach
 public void afterEachInParent() {
  System.out.println("After Each in Parent class");
 }
}
public class TestClass extends ParentClass {
 static {
  System.out.println("Static block of Test class");
 }

 public TestClass() {
  System.out.println("Constructor of Test class");
 }

 @BeforeAll
 public static void beforeAll() {
  System.out.println("Before All in Test class");
 }

 @AfterAll
 public static void afterAll() {
  System.out.println("After All in Test class");
 }

 @BeforeEach
 public void beforeEach() {
  System.out.println("Before Each In Test class");
 }

 @AfterEach
 public void afterEach() {
  System.out.println("After Each in Test class");
 }

 @Test
 public void testOne() {
  System.out.println("Test 1 in Test class");
 }
}

/*
Output:

Static block of Parent class
Before All in Parent class
Static block of Test class
Before All in Test class
Constructor of Parent class
Constructor of Test class
Before Each in Parent class
Before Each In Test class
Test 1 in Test class
After Each in Test class
After Each in Parent class
After All in Test class
After All in Parent class
*/

Порядок, в котором выполняются эти методы:

Это все на данный момент. Не стесняйтесь оставлять любые комментарии или вопросы, которые у вас есть.
Удачного кодирования!