JUnit 5 Introduction

1. Introduction

JUnit 5 is the next generation of the popular JUnit 4 testing framework. It is designed to support Java 8 and above and introduces several new features and improvements. The main goal of JUnit 5 is to provide a flexible and modern testing framework that can accommodate various testing styles.

2. What is JUnit 5?

JUnit 5 is composed of several different modules from three sub-projects:

JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage

2.1 JUnit Platform

The JUnit Platform serves as a foundation for launching testing frameworks on the JVM. It defines the TestEngine API for developing testing frameworks that run on the platform. Additionally, the platform provides a Console Launcher to launch the platform from the command line and build plugins for Gradle and Maven, as well as a JUnit 4-based Runner for running any TestEngine on the platform.

2.2 JUnit Jupiter

JUnit Jupiter is the combination of the new programming model and extension model for writing tests and extensions in JUnit 5. The Jupiter sub-project provides a TestEngine for running Jupiter-based tests on the platform.

2.3 JUnit Vintage

JUnit Vintage provides backward compatibility for running JUnit 3 and JUnit 4 tests on the JUnit 5 platform.

2.4 Supported Java Versions

JUnit 5 requires Java 8 (or higher) at runtime. However, you can still test code that has been compiled with previous versions of the JDK.

2.5 How to Run JUnit 4 Tests on the JUnit Platform?

To run JUnit 4 tests on the JUnit platform, include the junit-vintage-engine artifact in your test runtime path. JUnit 3 and JUnit 4 tests will automatically be picked up by the JUnit Platform launcher.

2.6 JUnit 5 Advantages

  • Granularity: JUnit 5 allows importing only the necessary modules instead of a single large library as in JUnit 4.
  • Multiple Runners: JUnit 5 supports multiple runners working simultaneously.
  • Java 8 Features: JUnit 5 leverages Java 8 features, providing more modern capabilities.

3. Key Features of JUnit 5

1. Modular Architecture

  • JUnit Platform: Foundation for launching testing frameworks on the JVM.
  • JUnit Jupiter: New programming and extension model for writing tests.
  • JUnit Vintage: Supports running JUnit 3 and JUnit 4 tests.

2. Java 8 and Beyond

  • Full support for Java 8 features, such as lambdas and streams.
  • Ability to leverage new Java features and APIs.

3. Annotations and Extensions

  • New Annotations: Includes @Test, @BeforeEach, @AfterEach, @BeforeAll, @AfterAll.
  • Extensions: Flexible mechanism to customize test execution.

4. Dynamic and Nested Tests

  • Dynamic Tests: Generate tests at runtime.
  • Nested Tests: Group tests hierarchically.

5. Improved Assertions

  • Enhanced assertion methods, such as assertAll for grouped assertions and assertThrows for exception testing.

6. Parameterized Tests

  • Run a single test method multiple times with different parameters using @ParameterizedTest.

7. Multiple Runners

  • Support for multiple test runners simultaneously, allowing for more complex test scenarios.

8. Improved IDE and Tool Support

  • Better integration with modern IDEs and build tools (e.g., Maven, Gradle).

9. Migration Support

  • JUnit Vintage allows existing JUnit 3 and JUnit 4 tests to run in JUnit 5 environments, easing migration.

10. Custom Display Names

  • Ability to provide custom names for test methods using @DisplayName.

4. Dependencies and Setup

Installing JUnit 5 is straightforward. Add the following dependencies to your pom.xml:



Additionally, you need to configure the Maven Surefire Plugin:


5. Creating Our First JUnit Test

Let's create a simple JUnit test to demonstrate how to use JUnit 5.

Example Test Class

import static org.junit.jupiter.api.Assertions.*;

import org.junit.jupiter.api.Test;

class FirstJunit5Test {

    void testAddition() {
        int sum = 1 + 1;
        assertEquals(2, sum, "1 + 1 should equal 2");

    void testSubtraction() {
        int result = 2 - 1;
        assertEquals(1, result, "2 - 1 should equal 1");

    void testFailure() {
        fail("This test is meant to fail");

Explanation of the Code

  1. Imports: The static import import static org.junit.jupiter.api.Assertions.*; allows us to use assertion methods like assertEquals and fail directly.
  2. Test Methods: The @Test annotation marks the methods as test methods that JUnit should execute.
  3. Assertions: The assertEquals method checks if the actual value matches the expected value. The fail method explicitly fails the test with a given message.

Deep Dive into JUnit 5 Framework


JUnit 5 provides a robust and modern framework for writing and running tests in Java. With its modular architecture, support for Java 8 features, and new functionalities, it offers significant improvements over JUnit 4. By following this guide and exploring the additional resources, you can effectively leverage JUnit 5 for your testing needs.

For more in-depth tutorials, visit Java Guides - JUnit 5.

< Previous Next >

JUnit 5 Tutorial