'Y'

JUnit 5 Architecture

Abstract: This article discusses the new architecture of JUnit 5, the shortcomings of the previous JUnit 4 version, and how the modular approach changed things and the advantages it has come with. It also shows you how to migrate the JUnit 4 code to JUnit 5, capitalizing the new features.

Abstract: This article discusses the new architecture of JUnit 5, the shortcomings of the previous JUnit 4 version, and how the modular approach changed things and the advantages it has come with. It also shows you how to migrate the JUnit 4 code to JUnit 5, capitalizing the new features.

1. JUnit 5 modularity


JUnit 5 means it is time for a new approach. It hasnít come instantly; it required reflection, and the shortcomings of JUnit 4 are a good input for the needed improvements. Architects know the problems, and they decided to go on the path of reduced sizes and modularity.

A new approach, a modular one, was necessary in order to allow the evolution of the JUnit framework. Its architecture had to allow JUnit to interact with different programmatic clients, with different tools and IDEs. The logical separation of concerns required:

  • An API to write tests, dedicated mainly to the developers.
  • A mechanism for discovering and running the tests.
  • An API to allow the easy interaction with IDEs and tools and to run the tests from them.

As a consequence, the resulting JUnit 5 architecture contained three modules (fig. 1):

  • JUnit Platform, which serves as a foundation for launching testing frameworks on the JVM (Java Virtual Machine), also provides an API to launch tests from either the console, IDEs, or build tools.
  • JUnit Jupiter, the combination of the new programming model and extension model for writing tests and extensions in JUnit 5. The name has been chosen from the fifth planet of our Solar System, which is also the largest one.
  • JUnit Vintage, a test engine for running JUnit 3 and JUnit 4 based tests on the platform, ensuring the necessary backwards compatibility.

modular architecture of JUnit 5.jpg

Figure 1 The modular architecture of JUnit 5


2. JUnit 5 Platform


Going further with the modularity idea, weíll have a brief look at the artifacts contained into the JUnit 5 Platform (fig. 2):

  • junit-platform-commons, an internal common library of JUnit, intended solely for usage within the JUnit framework itself. Any usage by external parties isnít supported.
  • junit-platform-console, which provides support for discovering and executing tests on the JUnit Platform from the console.
  • junit-platform-console-standalone an executable JAR with all dependencies included. Itís used by Console Launcher, a command-line Java application that lets you launch the JUnit Platform from the console. For example, it can be used to run JUnit Vintage and JUnit Jupiter tests and print test execution results to the console.
  • junit-platform-engine, a public API for test engines.
  • junit-platform-launcher, a public API for configuring and launching test plans, typically used by IDEs and build tools.
  • junit-platform-runner, a runner for executing tests and test suites on the JUnit Platform in a JUnit 4 environment.
  • junit-platform-suite-api, which contains the annotations for configuring test suites on the JUnit Platform.
  • junit-platform-surefire-provider, which provides support for discovering and executing tests on the JUnit Platform using Maven Surefire.junit-platform-gradle-plugin, which provides support for discovering and executing tests on the JUnit Platform using Gradle.


Interested in Java? Check out our trainings.


Catalin Tudose
Java and Web Technologies Expert

Share the knowledge

Luxoft Warsaw - Warsaw Spire, plac Europejski 1, 00-844 Warszawa
Dimitrie Pompeiu nr 5-7 , building C, Et. 5, sect 2, Bucharest, 014459

Contact phone:

021 371 4858
Luxoft Poland Wroclaw - Silver Tower pl. Konstytucji 3-go Maja 3 50-048 Wroclaw
Aleja Generała Tadeusza Bora-Komorowskiego 25, Quattro Business Park Five, 31-476 Kraków, Poland

Contact phone:

+48 122110650
Success
Thank you.
Your request has been received.