In this post, we will talk and learn about the JUnit 5 life cycle @BeforeEach and @AfterEach annotations using a sample project.
@BeforeEach Annotation
This annotation used to indicate that the annotated method should be executed before each @Test method in the current class. It is the replacement of @Before annotation in JUnit 4.
@AfterEach Annotation
This annotation is used to indicate that the annotated method should be executed after each @Test method in the current class. It is a replacement of @After annotation in JUnit 4.
NOTE: @AfterEach and @BeforeEach annotated methods MUST NOT be a static method otherwise it will throw runtime error. as below
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
org.junit.platform.commons.JUnitException: @BeforeEach method 'static void kkjavatutorials.com.MyUtilsTest.beforeEach()' must not be static. at org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.assertNonStatic(LifecycleMethodUtils.java:65) at org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.lambda$findMethodsAndAssertNonStatic$1(LifecycleMethodUtils.java:89) at java.util.ArrayList.forEach(ArrayList.java:1249) at java.util.Collections$UnmodifiableCollection.forEach(Collections.java:1080) at org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findMethodsAndAssertNonStatic(LifecycleMethodUtils.java:89) at org.junit.jupiter.engine.descriptor.LifecycleMethodUtils.findBeforeEachMethods(LifecycleMethodUtils.java:48) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.registerBeforeEachMethodAdapters(ClassBasedTestDescriptor.java:425) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:154) at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.prepare(ClassBasedTestDescriptor.java:77) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75) at java.util.ArrayList.forEach(ArrayList.java:1249) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:170) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:154) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:90) at org.eclipse.jdt.internal.junit5.runner.JUnit5TestReference.run(JUnit5TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) |
@BeforeEach and @AfterEach annotations example
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>kkjavatutorials.com</groupId> <artifactId>JUnitAfterEachAndBeforeEachExample</artifactId> <version>0.0.1-SNAPSHOT</version> <name>JUnitAfterEachAndBeforeEachExample</name> <properties> <maven.compiler.target>8</maven.compiler.target> <maven.compiler.source>8</maven.compiler.source> <junit.jupiter.version>5.5.2</junit.jupiter.version> </properties> <dependencies> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-api</artifactId> <version>${junit.jupiter.version}</version> <scope>test</scope> </dependency> </dependencies> </project> |
Java Class for that we have to write JUnit Test:
1 2 3 4 5 6 7 8 |
package kkjavatutorials.com; public class MyUtils { public int add (int n1,int n2) { return n1+n2; } } |
JUnit Test Class with Which makes use of @BeforeEach and @AfterEach annotations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package kkjavatutorials.com; import static org.junit.jupiter.api.Assertions.assertEquals; 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; class MyUtilsTest { private static MyUtils myUtils; @BeforeAll static void setUp(){ System.out.println("Test data set up.."); myUtils = new MyUtils(); } @BeforeEach void beforeEach(){ System.out.println("@BeforeEach executed"); } @Test void addPositiveNumbersTest() { System.out.println("addPositiveNumbersTest Method.."); assertEquals(10, myUtils.add(6, 4)); } @Test void addNegativeNumbersTest() { System.out.println("addNegativeNumbersTest Method.."); assertEquals(-10, myUtils.add(-6, -4)); } @AfterAll static void tearDown(){ System.out.println("Test data tearDown.."); myUtils = null; } @AfterEach void afterEach(){ System.out.println("@AfterEach executed"); } } |
The output of the above project
You May Also Like:
What is JUnit?
JUnit 5 Annotations
JUnit 5 Maven Dependency
JUnit 5 with Gradle Dependency
JUnit 5 Test Lifecycle
JUnit 5 @BeforeAll annotation example
Unit 5 @AfterAll annotation example
JUnit 5 Display Names
Assertions in JUnit 5 Examples
Third-party Assertion Libraries support in JUnit 5
JUnit 5 Assumptions Examples
JUnit 5 @Disabled Test Example
Conditional Test Execution in JUnit
Test Execution Order in Junit 5
JUnit 5 Nested Tests Example
Dependency Injection and Testing in JUnit 5
Test Interfaces and Default Methods in JUnit 5
JUnit 5 @RepeatedTest Annotation example
Junit 5 Parameterized Tests with examples
Argument Conversion in Parameterized Tests in Junit 5
Argument Aggregation in Parameterized Tests in Junit 5
Customizing Display Names of Parameterized Tests in JUnit 5
Dynamic Tests example in Junit 5
JUnit 5 Test Suites Examples
JUnit 5 Temporary Directory Support
How to execute Junit 5 tests in Eclipse IDE
JUnit 5 Test Templates for Eclipse
JUnit 5 vs JUnit 4
That’s all about JUnit 5 @BeforeEach and @AfterEach annotation Example
If you have any feedback or suggestion please feel free to drop in below comment box.