@AfterEach is used to signal that the annotated method should be executed after each @Test, @RepeatedTest, @ParameterizedTest, @TestFactory, and @TestTemplate method in the current test class.
Constraints on @AfterEach method
@AfterEach methods must have a void return type, must not be private, and must not be static.
Can an @AfterEach method take parameters?
Yes, an @AfterEach method may optionally declare parameters to be resolved by ParameterResolvers.
Let’s see it with an example.
AfterEachMethodDemo1.java
package com.sample.app;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class AfterEachMethodDemo1 {
@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");
}
}
Run above application, you will see below messages in console.
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
Inheritance and Execution Order
@AfterEach methods are inherited from superclasses as long as they are not overridden. Furthermore, @AfterEach methods from superclasses will be executed after @AfterEach methods in subclasses.
BaseAfterEachMethods.java
package com.sample.app;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
public class BaseAfterEachMethods {
@BeforeEach
void setupSystem() {
System.out.println("Setting up the system");
}
@BeforeEach
void setupLogger() {
System.out.println("Setting up logger");
}
@AfterEach
void cleanupSystem() {
System.out.println("Cleaning the system\n");
}
@AfterEach
void cleanupLogger() {
System.out.println("Cleaning logger");
}
}
LoginServiceTest.java
package com.sample.app;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
public class LoginServiceTest extends BaseAfterEachMethods {
@BeforeEach
void setupCreds() {
System.out.println("Setting up user credentials");
}
@Test
public void loginTest() {
System.out.println("Inside login test");
}
@Test
public void logoutTest() {
System.out.println("Inside logout test");
}
@AfterEach
void deleteCreds() {
System.out.println("Deleting Credentials");
}
}
Run LoginServiceTest, you will see below messages in console.
Setting up logger Setting up the system Setting up user credentials Inside login test Deleting Credentials Cleaning logger Cleaning the system Setting up logger Setting up the system Setting up user credentials Inside logout test Deleting Credentials Cleaning logger Cleaning the system
Is there any execution order guarantee for @AfterEach methods?
JUnit does not guarantee the execution order of multiple @AfterEach methods that are declared within a single test class or test interface. So, it is recommended to declare at most one @BeforeEach method and at most one @AfterEach method per test class or test interface unless there are no dependencies between the @BeforeEach methods or between the @AfterEach methods.
You can download all the applications from this link.
https://github.com/harikrishna553/junit5/tree/master/junit5-examples
No comments:
Post a Comment