@BeforeAll annotation is used to signal that the annotated method should be executed before all tests in the current test class. @BeforeAll methods are only executed once for a given test class.
Constraints on @BeforeAll method
a. @BeforeAll methods must have a void return type, must not be private, and must be static by default.
b. @BeforeAll methods are not supported in @Nested test classes or as interface default methods unless the test class is annotated with @TestInstance(Lifecycle.PER_CLASS).
Can a @BeforeAll method takes any parameters?
Yes, @BeforeAll methods may optionally declare parameters to be resolved by ParameterResolvers.
BeforeAllDemo1.java
package com.sample.app;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class BeforeAllDemo1 {
@BeforeAll
static void beforeAll_1() {
System.out.println("Inside beforeAll_1\n");
}
@BeforeAll
static void beforeAll_2() {
System.out.println("Inside beforeAll_2\n");
}
@BeforeEach
void beforeEach_1() {
System.out.println("\nInside beforeEach_1");
}
@BeforeEach
void beforeEach_2() {
System.out.println("Inside beforeEach_2");
}
@Test
public void test1() {
System.out.println("Inside test1");
}
@Test
public void test2() {
System.out.println("Inside test2");
}
@AfterEach
void afterEach_1() {
System.out.println("Inside afterEach_1");
}
@AfterEach
void afterEach_2() {
System.out.println("Inside afterEach_2");
}
@AfterAll
static void afterAll_1() {
System.out.println("\nInside afterAll_1");
}
@AfterAll
static void afterAll_2() {
System.out.println("\nInside afterAll_2");
}
}
Run above application, you will see below messages in console.
Inside beforeAll_1 Inside beforeAll_2 Inside beforeEach_1 Inside beforeEach_2 Inside test1 Inside afterEach_1 Inside afterEach_2 Inside beforeEach_1 Inside beforeEach_2 Inside test2 Inside afterEach_1 Inside afterEach_2 Inside afterAll_1 Inside afterAll_2
How @BeforeAll methods will work with Inheritance?
@BeforeAll methods are inherited from superclasses as long as they are not hidden or overridden. Furthermore, @BeforeAll methods from superclasses will be executed before @BeforeAll methods in subclasses.
BaseBeforeAllMethods.java
package com.sample.app;
import org.junit.jupiter.api.BeforeAll;
public class BaseBeforeAllMethods {
@BeforeAll
static void setupSystem() {
System.out.println("Inside setup system");
}
}
LoginServTest.java
package com.sample.app;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class LoginServTest extends BaseBeforeAllMethods {
@BeforeAll
static void setupLogger() {
System.out.println("Inside setup logger\n");
}
@BeforeEach
void setupCreds() {
System.out.println("Setting up user credentials");
}
@Test
public void loginTest() {
System.out.println("Inside login test\n");
}
@Test
public void logoutTest() {
System.out.println("Inside logout test\n");
}
}
Run ‘LoginServTest’ class, you will see below messages in console.
Inside setup system Inside setup logger Setting up user credentials Inside login test Setting up user credentials Inside logout test
Is there any execution order guarantee for @BeforeAll methods?
JUnit Jupiter does not guarantee the execution order of multiple @BeforeAll methods that are declared within a single test class or test interface. While it may at times appear that these methods are invoked in alphabetical order, they are in fact sorted using an algorithm that is deterministic but intentionally non-obvious.
So it is recommended to have at most one @BeforeAll method and at most one @AfterAll method per test class or test interface unless there are no dependencies between the @BeforeAll methods or between the @AfterAll methods.
Previous Next Home
No comments:
Post a Comment