This document contains the change log for all JUnit 5 releases since 5.6 GA.

Please refer to the User Guide for comprehensive reference documentation for programmers writing tests, extension authors, and engine authors as well as build tool and IDE vendors.


Date of Release:


For a complete list of all closed issues and pull requests for this release, consult the 5.7 M2 milestone page in the JUnit repository on GitHub.

Overall Improvements

  • Javadoc JARs now contain package-list in addition to element-list for compatibility with tools like NetBeans 11.

JUnit Platform

  • The following APIs have been promoted from "experimental":

    • LauncherConstants is now "stable"

    • LauncherConfig (except for methods introduced in 5.7) is now "stable"

    • LegacyXmlReportGeneratingListener is now "stable"

    • org.junit.platform.testkit.engine is now "maintained"

Bug Fixes

  • Characters in exception messages and other user-supplied values that are not allowed in XML are now replaced with their character reference – for example, \0 becomes �.

Deprecations and Breaking Changes

  • EngineTestKit no longer takes into account implicit configuration parameters (i.e. system properties and the classpath resource) by default. This change makes tests executed via EngineTestKit independent of the environment they are executed in.

New Features and Improvements

  • When using ConsoleLauncher, explicitly selected classes from --select-class and --select-method are now always executed regardless of class name patterns provided with --include-classname or the default class name pattern.

  • The ConsoleLauncher now honors the --disable-ansi-colors option when printing usage help.

  • New FilePosition support in FileSelector and ClasspathResourceSelector.

  • Custom PostDiscoveryFilter implementations can now be registered via Java’s ServiceLoader mechanism.

  • New getJavaClass() and getJavaMethod() methods in

  • New module org.junit.platform.jfr added. When running on Java 11 or later, it provides and registers a TestExecutionListener that generates Java Flight Recorder events.

  • ExecutionRecorder in junit-platform-testkit is now public for fine-grained testing of classes that use EngineExecutionListener.

  • ForkJoinPoolHierarchicalTestExecutorService can now be constructed by supplying a ParallelExecutionConfiguration.

JUnit Jupiter

  • The following APIs have been promoted from "experimental" to "stable":

    • junit-jupiter-migrationsupport

    • junit-jupiter-params (i.e. @ParameterizedTest etc.)

    • @TestMethodOrder, MethodOrderer, and its pre-5.7 implementations

    • @DisplayNameGeneration, DisplayNameGenerator, and its pre-5.7 implementations

    • @Timeout

    • TestInstanceFactory

    • TestInstancePreDestroyCallback

    • TestInstances and corresponding ExtensionContext methods

    • TestWatcher

    • Kotlin-specific assertions that were introduced in 5.1

Bug Fixes

  • Registered TestInstancePreDestroyCallback extensions are now always called if an instance of a test class was created, regardless whether any registered TestInstancePostProcessor extension threw an exception.

  • Disabled @TestTemplate methods (e.g. @ParameterizedTest and @RepeatedTest methods) are now reported to registered TestWatcher extensions.

  • Inherited @BeforeEach methods are now executed on correct instances for @Nested classes.

Deprecations and Breaking Changes

  • MethodOrderer.Alphanumeric has been deprecated in favor of MethodOrderer.MethodName which provides the exact same functionality but has a more descriptive name.

New Features and Improvements

  • All @Enabled*/@Disabled* annotations now have an optional disabledReason attribute that can be used to provide and additional explanation as to why a test or container might be disabled.

  • New assertLinesMatch() method overloads in Assertions that accept two Stream<String> instances for comparison.

  • @CsvFileSource now allows one to specify file paths as an alternative to classpath resources.

  • New junit.jupiter.testmethod.order.default configuration parameter to set the default MethodOrderer that will be used unless @TestMethodOrder is present.

  • JAVA_16 has been added to the JRE enum for use with JRE-based execution conditions.

  • Add MethodOrderer.MethodName to replace MethodOrderer.Alphanumeric with the exact same functionality but a more descriptive name.

  • assertTimeoutPreemptively in Assertions now reports the stacktrace of the timed out thread in the cause of the AssertionFailedError.

  • assertTimeoutPreemptively now uses threads with a specific name, conveying their use by the framework, to facilitate debugging and stack trace analysis.

  • New TypedArgumentConverter for converting one specific type to another, therefore reducing boilerplate type checks compared to implementing ArgumentConverter directly.

  • Added ExtensionContext.getConfigurationParameter(String, Function<String, T>) convenience method for reading transformed configuration parameters from extensions.

  • Arguments in display names of parameterized test invocations are now truncated if they exceed a configurable maximum length (defaults to 512 characters).

JUnit Vintage

Bug Fixes

Deprecations and Breaking Changes

New Features and Improvements


Date of Release: April 19, 2020


  • New @EnabledIf/@DisabledIf annotations for conditional execution based on method calls

  • New MethodOrderer named DisplayName that orders methods based on their display names

  • New DisplayNameGenerator named Simple that removes parentheses for empty parameter lists

  • assertThrows() for Kotlin can now be used with suspending functions

  • TestExecutionListener deactivation via a configuration parameter

  • EngineTestKit now allows for testing post-discovery filtering and pruning

  • Improved interoperability with Spock for the Vintage test engine

For a complete list of all closed issues and pull requests for this release, consult the 5.7 M1 milestone page in the JUnit repository on GitHub.

JUnit Platform

Deprecations and Breaking Changes

  • In the EngineTestKit API, the all(), containers(), and tests() methods in EngineExecutionResults that were deprecated in JUnit Platform 1.6.0 have been removed in favor of allEvents(), containerEvents(), and testEvents(), respectively.

  • The following methods in EngineTestKit are now deprecated with replacements:

    • execute(String, EngineDiscoveryRequest)execute(String, LauncherDiscoveryRequest)

    • execute(TestEngine, EngineDiscoveryRequest)execute(TestEngine, LauncherDiscoveryRequest)

    • Builder.filters(DiscoveryFilter…​)Builder.filters(Filter…​)

New Features and Improvements

  • The number of containers and tests excluded by post discovery filters based on their tags is now logged, along with the exclusion reasons.

  • New junit.platform.execution.listeners.deactivate configuration parameter that allows one to specify a comma-separated list of patterns for deactivating TestExecutionListener implementations registered via the ServiceLoader mechanism.

  • The @Testable annotation may now be applied directly to fields.

  • New Node.DynamicTestExecutor#execute(TestDescriptor, EngineExecutionListener) method for engines that wish to provide a custom EngineExecutionListener and cancel or wait for the execution of a submitted test via the returned Future.

  • New EngineExecutionListener.NOOP EngineExecutionListener implementation.

  • All declared methods in the EngineExecutionListener API now have empty default implementations.

  • The EngineTestKit now reuses the same test discovery and execution logic as the Launcher. Thus, it’s now possible to test an engine’s behavior in the presence of post-discovery filters (e.g. tag filters) and with regard to pruning.

  • The EngineTestKit now supports matching conditions with events loosely, i.e. an incomplete match with or without a fixed order.

JUnit Jupiter

Bug Fixes

  • @TempDir is now able to clean up files in read-only directories.

  • The Jupiter engine now ignores MethodSelectors for methods in non-Jupiter test classes instead of failing for missing methods in such cases.

New Features and Improvements

  • New @EnabledIf and @DisabledIf annotations can be used to enable or disable a test or container based on condition methods.

  • New MethodOrderer named DisplayName that sorts test methods alphanumerically based on their display names.

  • New DisplayNameGenerator named Simple (based on Standard) that removes trailing parentheses for methods with no parameters.

  • assertThrows() for Kotlin can now be used with suspending functions and other lambda contexts that require inlining.

  • The JRE enum now provides a static currentVersion() method that returns the enum constant for the currently executing JRE, e.g. for use in custom execution conditions and other extensions.

  • The name attribute of @ParameterizedTest is now clearly documented to be a MessageFormat pattern.

  • Synthetic constructors are now ignored when instantiating a test class.

  • The Javadoc for the provideTestTemplateInvocationContexts() method in TestTemplateInvocationContextProvider has been aligned with the actual implementation. Providers are now officially allowed to return an empty stream, and the error message when all provided streams are empty is now more helpful.

  • New getDisplayName() method in MethodDescriptor for use in MethodOrderer implementations.

JUnit Vintage

Bug Fixes

  • The Vintage engine no longer fails when resolving a MethodSelector for methods of test classes that cannot be found via reflection. This allows selecting Spock feature methods by their source code name even though they have a generated method name in the bytecode.

New Features and Improvements

  • The internal JUnit4VersionCheck class — which verifies that a supported version of JUnit 4 is on the classpath — now implements a lenient version ID parsing algorithm in order to support custom version ID formats such as 4.12.0, 4.12-patch_1, etc.


Date of Release: April 10, 2020

Scope: Bug fixes since 5.6.1

For a complete list of all closed issues and pull requests for this release, consult the 5.6.2 milestone page in the JUnit repository on GitHub.

JUnit Platform

Bug Fixes

  • ReflectionSupport.findNestedClasses() no longer detects inner class cycles for classes that do not match the supplied Predicate. For example, JUnit Jupiter no longer throws an exception if an inner class cycle is detected in a nested class hierarchy whose inner classes are not annotated with @Nested.

JUnit Jupiter

Bug Fixes

  • Test discovery no longer halts with an exception for inner class hierarchies that form a cycle if such inner classes are not annotated with @Nested.

JUnit Vintage

Bug Fixes

  • Generating display names from JUnit 4 Descriptions now falls back to getDisplayName if getMethodName returns a blank String instead of throwing an exception.


Date of Release: March 22, 2020

Scope: Bug fixes since 5.6.0

For a complete list of all closed issues and pull requests for this release, consult the 5.6.1 milestone page in the JUnit repository on GitHub.

JUnit Platform

Bug Fixes

  • In order to avoid file locking issues on Microsoft Windows, URLs are no longer cached when loading files.

  • The presence of multiple files on the classpath now only results in a warning if the files have different URLs.

JUnit Jupiter

Bug Fixes

  • TestInstancePreDestroyCallback extensions are now invoked in reverse registration order when PER_CLASS test instance lifecycle semantics have been configured.

JUnit Vintage

No changes.


Date of Release: January 20, 2020


  • New @EnabledForJreRange and @DisabledForJreRange execution conditions

  • @Order allows to specify relative order

  • Parameter names are included in default display names of parameterized test invocations

  • Improvements to @CsvSource and @CsvFileSource

  • New TestInstancePreDestroyCallback extension API

  • Performance improvements and bug fixes for the Vintage engine

  • Improved error reporting for failures during test discovery and execution

  • Support for using any() and none() in tag expressions

  • org.junit.platform.console now provides a java.util.spi.ToolProvider

  • DiscoverySelectors for tests in inherited nested classes

  • OSGi metadata

  • Minor bug fixes and improvements

For complete details consult the 5.6.0 Release Notes online.