Статья поможет вам понять порядок выполнения методов, использующих аннотации, предоставляемые 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 */
Порядок, в котором выполняются эти методы:
Это все на данный момент. Не стесняйтесь оставлять любые комментарии или вопросы, которые у вас есть.
Удачного кодирования!