This document contains the change log for all JUnit 5 releases since 5.12 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.
5.13.1
Date of Release: June 7, 2025
Scope: Bug fixes and enhancements since 5.13.0
For a complete list of all closed issues and pull requests for this release, consult the 5.13.1 milestone page in the JUnit repository on GitHub.
JUnit Jupiter
Bug Fixes
-
The 5.13.0 release introduced a regression regarding the execution order in test classes containing both test methods and
@Nestedtest classes. When classpath scanning was used during test discovery — for example, when resolving a package selector for a@Suiteclass — test methods in@Nestedclasses were executed before test methods in their enclosing class. This undesired change in behavior has now been reverted so that tests in@Nestedtest classes are always executed after tests in enclosing test classes again. -
Fix support for
AnnotationBasedArgumentsProviderimplementations that override the deprecatedprovideArguments(ExtensionContext, Annotation)method.
5.13.0
Date of Release: May 30, 2025
Scope:
-
Introduce
@ClassTemplateand@ParameterizedClasssupport in JUnit Jupiter -
Access to
ParameterInfofor JUnit Jupiter extensions -
New
@SentenceFragmentannotation for use withIndicativeSentencesdisplay name generator -
Add
--redirect-stdoutand--redirect-stderroptions toConsoleLauncher -
Introduce test discovery support in
EngineTestKit -
Reporting of discovery issues for test engines
-
Resource management for launcher sessions and execution requests
-
GraalVM: removal of
native-image.propertiesfiles from JARs -
Bug fixes and other minor improvements
For a complete list of all closed issues and pull requests for this release, consult the 5.13.0-M1, 5.13.0-M2, 5.13.0-M3, 5.13.0-RC1, and 5.13.0 milestone pages in the JUnit repository on GitHub.
Overall Changes
Deprecations and Breaking Changes
-
The JUnit feature in GraalVM Native Build Tools (NBT) has been rewritten to no longer require JUnit classes to be initialized at build time when running on JDK 22 and later. Therefore, JUnit’s JARs no longer ship with
native-image.propertiesfiles that contain--initialize-at-build-timeoptions (introduced in 5.12.0). Please update to the most recent version of GraalVM Native Build Tools prior to upgrading to this version of JUnit. Please refer to the Upgrade Instructions in the wiki for details if you’re on NBT 0.10.x or earlier.
JUnit Platform
Bug Fixes
-
Notify
LauncherDiscoveryListenerimplementation registered viaLaucherConfigor on theLauncherofselectorProcessedevents. -
Reintroduce support for JVM shutdown hooks when using the
-cp/--classpathoption of theConsoleLauncher. Prior to this release, the created class loader was closed prior to JVM shutdown hooks being invoked, which caused hooks to fail with aClassNotFoundExceptionwhen loading classes during shutdown. -
Fix support of
--uidand--select-unique-idoptions in the console launcher.
New Features and Improvements
-
Introduce a mechanism for
TestEngineimplementations to report issues encountered during test discovery. If an engine reports aDiscoveryIssuewith aSeverityequal to or higher than a configurable critical severity, its tests will not be executed. Instead, the engine will be reported as failed during execution with a failure message listing all critical issues. Non-critical issues will be logged but will not prevent the engine from executing its tests. The critical severity can be configured via a new configuration parameter and, currently, defaults toERROR. Please refer to the User Guide for details.If you’re a test engine maintainer, please see the User Guide for details on how to start reporting discovery issues.
-
Start reporting discovery issues for problematic
@Suiteclasses:-
Invalid
@Suiteclass declarations (for example, whenprivate) -
Invalid
@BeforeSuite/@AfterSuitemethod declarations (for example, when notstatic) -
Cyclic dependencies between
@Suiteclasses
-
-
Introduce resource management mechanism that allows preparing and sharing state across executions or test engines via stores that are scoped to a
LauncherSessionorExecutionRequest. The Jupiter API uses these stores as ancestors to theStoreinstances accessible viaExtensionContextand provides a new method to access them directly. Please refer to the User Guide for examples of managing session-scoped and request-scoped resources. -
New
ConsoleLauncheroptions--redirect-stdoutand--redirect-stderrfor redirectingstdoutandstderroutput streams to files. -
Add
TestDescriptor.Visitor.composite(List)factory method for creating a composite visitor that delegates to the given visitors in order. -
Introduce test discovery support in
EngineTestKitto ease testing for discovery issues produced by aTestEngine. Please refer to the User Guide for details. -
Make validation of including
EngineFiltersmore strict to avoid misconfiguration, for example, due to typos. Prior to this release, an exception was only thrown when none of a filter’s included IDs matched any engine. Now, an exception is thrown if at least one included ID across all filters did not match any engine.
JUnit Jupiter
Bug Fixes
-
If the
autoCloseArgumentsattribute in@ParameterizedTestis set totrue, all arguments returned by registeredArgumentsProviderimplementations are now closed even if the test method declares fewer parameters. -
AutoCloseablearguments returned by anArgumentsProviderare now closed even if they are wrapped withNamed. -
AutoCloseablearguments returned by anArgumentsProviderare now closed even if a failure happens prior to invoking the parameterized method. -
Validate all versions specified in
@EnabledOnJreand@DisabledOnJreannotations.
New Features and Improvements
-
New
@ClassTemplateannotation andClassTemplateInvocationContextProviderAPI that allow declaring a top-level or@Nestedtest class as a template to be invoked multiple times. This may be used, for example, to inject different parameters to be used by all tests in the class template or to set up each invocation of the class template differently. Please refer to the User Guide for details. -
New
BeforeClassTemplateInvocationCallbackandAfterClassTemplateInvocationCallbackextension callback interfaces allow implementing extensions that are invoked before and after each invocation of a class template. -
New
@ParameterizedClasssupport that builds on@ClassTemplateand allows declaring a top-level or@Nestedtest class as a parameterized test class to be invoked multiple times with different arguments. The same@…Sourceannotations supported with@ParameterizedTestmay be used to provide arguments via constructor or field injection. Please refer to the User Guide for details. -
New
@ParameterizedClass-specific@BeforeParameterizedClassInvocation/@AfterParameterizedClassInvocationlifecycle methods that are invoked once before/after each invocation of the parameterized class. -
Provide access to the parameters and resolved arguments of a
@ParameterizedTestor@ParameterizedClassby storingParameterInfoin theExtensionContext.Storefor retrieval by other extensions. Please refer to the Javadoc for details. -
New
@SentenceFragmentannotation which allows one to supply custom text for individual sentence fragments when using theIndicativeSentencesDisplayNameGenerator. See the updated documentation in the User Guide for an example. -
New
TestTemplateInvocationContext.prepareInvocation(ExtensionContext)callback method which allows extensions to prepare theExtensionContextbefore the test template method is invoked. This may be used, for example, to store entries in theExtensionContext.Storeto benefit from its cleanup support or for retrieval by other extensions. -
Start reporting discovery issues for potentially problematic test classes:
-
Invalid
@Testand@TestTemplatemethod declarations (for example, when return type is notvoid) -
Invalid
@TestFactorymethods (for example, when return type is invalid) -
Multiple method-level annotations (for example,
@Testand@TestTemplate) -
Invalid test class and
@Nestedclass declarations (for example,static@Nestedclasses) -
Potentially missing
@Nestedannotations (for example, non-abstract inner classes that contain test methods) -
Invalid lifecycle method declarations (for example, when
private) -
Invalid
@Tagsyntax -
Blank
@DisplayNamedeclarations -
Blank
@SentenceFragmentdeclarations -
@BeforeParameterizedClassInvocationand@AfterParameterizedClassInvocationmethods declared in non-parameterized test classes
-
-
By default,
AutoCloseableobjects put intoExtensionContext.Storeare now treated like instances ofCloseableResource(which has been deprecated) and are closed automatically when the store is closed at the end of the test lifecycle. It’s possible to revert to the old behavior via a configuration parameter. Please also see the migration note for third-party extensions wanting to support both JUnit 5.13 and earlier versions. -
java.util.Localearguments are now converted according to the IETF BCP 47 language tag format. See the User Guide for details. -
Avoid reporting potentially misleading validation exception for
@ParameterizedClasstest classes and@ParameterizedTestmethods as suppressed exception for earlier failures. -
Add support for Kotlin
Sequenceto@MethodSource,@FieldSource, and@TestFactory. -
Allow publishing files to an existing directory via
TestReporterandExtensionContext, for example, when re-running a test class.
5.12.2
Date of Release: April 11, 2025
Scope: Bug fixes and enhancements since 5.12.1
For a complete list of all closed issues and pull requests for this release, consult the 5.12.2 milestone page in the JUnit repository on GitHub.
5.12.1
Date of Release: March 14, 2025
Scope: Bug fixes and enhancements since 5.12.0
For a complete list of all closed issues and pull requests for this release, consult the 5.12.1 milestone page in the JUnit repository on GitHub.
5.12.0
Date of Release: February 21, 2025
Scope:
-
Output file attachments for tests and containers
-
Improvements to the Open Test Reporting XML output
-
Resource lock definition improvements
-
Thread dumps on test timeouts
-
Parameterized test validation improvements
-
Filtering support for auto-registered extensions
-
Kotlin contracts for assertions
-
Configurable Jupiter extension context scope
-
Enhancements to the
ConsoleLauncher -
Better support for GraalVM native image usage
-
Improved discovery support for file-based test engines
-
Customizable classpath scanning
-
Parallel execution support in JUnit Vintage engine
-
Numerous bug fixes and other enhancements
For complete details consult the 5.12.0 Release Notes online.