JUnit 5 aims to adapt the java 8 styles of coding and to be more robust and flexible than JUnit 4.
JUnit 5 vs JUnit 4 – Annotations
FEATURE | JUnit 4 | JUnit 5 |
Declare a test method | @Test | @Test |
The annotated method executes before all test methods in the current class | @BeforeClass | @BeforeAll |
The annotated method executes after all test methods in the current class | @AfterClass | @AfterAll |
The annotated method executes before each test method | @Before | @BeforeEach |
The annotated method executes after each test method | @After | @AfterEach |
Disable a test method/class | @Ignore | @Disabled |
Test factory for dynamic tests | NA | @TestFactory |
Nested tests | NA | @Nested |
Tagging and filtering | @Category | @Tag |
Register custom extensions | NA | @ExtendWith |
Architectural Difference
- JUnit 4 library has everything bundled into single jar file.
- Junit 5 is composed of 3 sub-projects i.e. JUnit Platform, JUnit Jupiter and JUnit Vintage.
JUnit Platform
It basically defines the TestEngine API for developing new testing frameworks that run on the JUnit Platform.
JUnit Jupiter
It has basically all new JUnit annotations and TestEngine implementation to run tests written with these annotations.
JUnit Vintage
It supports running JUnit 3 and JUnit 4 written tests on the JUnit 5 platform
Required JDK Version
- Junit 4 requires Java 5 or higher.
- Junit 5 requires Java 8 or higher.
Assertions
- On Junit 4, org.junit.Assert class has all assert methods to validate expected and resulting outcomes. They accept an extra parameter for error message as the FIRST argument in the method signature.
- In JUnit 5, org.junit.jupiter.Assertions class contains most of assert methods including additional assertThrows() and assertAll() methods. JUnit 5 assertions methods also have overloaded methods to support passing error message to be printed in case the test fails
Assumptions
In Junit 4, org.junit.Assumecontains methods for stating assumptions about the conditions in which a test is meaningful. It has the following five methods:
- assumeFalse()
- assumeNoException()
- assumeNotNull()
- assumeThat()
- assumeTrue()
In Junit 5, org.junit.jupiter.api.Assumptionscontains methods for stating assumptions about the conditions in which a test is meaningful. It has the following three methods:
- assumeFalse()
- assumingThat()
- assumeTrue()
Tagging and Filtering
- In Junit 4, @category annotation is used.
- In Junit 5, @tag annotation is used.
Test Suites
3rd Party Integration
- In Junit 4, there is no integration support for 3rd party plugins. They have to rely on reflection.
- JUnit 5 has basically a dedicated sub-project for this purpose i.e. JUnit Platform defines the TestEngine API to develop a test framework that runs on the platform.
You May Also Like:
Junit 5 Architecture
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 @BeforeEach and @AfterEach annotation Example
JUnit 5 Display Names
Assertions in JUnit 5 Examples
Third-party Assertion Libraries support in JUnit 5
JUnit 5 Assumptions Examples
Conditional Test Execution in JUnit 5
JUnit 5 Nested Tests Example
JUnit 5 @Tag Annotation example
Test Execution Order in Junit 5
Dependency Injection and Testing in JUnit 5
Test Interfaces and Default Methods in JUnit 5
That’s all about JUnit 5 vs JUnit 4
If you have any feedback or suggestion please feel free to drop in below comment box.