This document contains the change log for all JUnit releases since 5.13 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.

6.0.0-M1

Date of Release:

Scope:

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

Overall Improvements

Bug Fixes

Deprecations and Breaking Changes

  • Minimum required Java version is now Java 17.

  • Platform, Jupiter, and Vintage artifacts now use the same version number.

New Features and Improvements

  • All JUnit modules now use JSpecify's nullability annotations to indicate which method parameters, return types, etc. can be null.

JUnit Platform

Bug Fixes

Deprecations and Breaking Changes

  • Remove deprecated support for running the ConsoleLauncher without specifying a subcommand.

  • Remove support for deprecated non-conventional ConsoleLauncher options such as --h (rather than -h) or -help (rather than --help).

  • The junit-platform-runner module that provided the JUnit 4 based JUnitPlatform runner has been discontinued.

  • Support for Maven Surefire/Failsafe versions less than 3.0.0 has been dropped.

  • The following deprecated APIs have been removed:

    • ReflectionSupport.loadClass(String) method

    • ReflectionUtils.readFieldValue(…​) methods

    • ReflectionUtils.getMethod(…​) method

    • BlacklistedExceptions class

    • PreconditionViolationException class (from org.junit.platform.commons.util)

    • ClasspathScanningSupport class

    • ConfigurationParameters.size() method

    • MethodSelector.getMethodParameterTypes() method

    • NestedMethodSelector.getMethodParameterTypes() method

    • ReportEntry() constructor

    • SingleTestExecutor class

    • LauncherDiscoveryRequestBuilder() constructor

    • LegacyReportingUtils class

    • TestPlan.add(TestIdentifier), TestPlan.getChildren(String), and TestPlan.getTestIdentifier(String) methods

    • TestPlan.add(TestIdentifier) and TestPlan.getChildren(String) methods

    • @UseTechnicalNames annotation

    • EngineTestKit.execute(String, EngineDiscoveryRequest), EngineTestKit.execute(TestEngine, EngineDiscoveryRequest), and EngineTestKit.Builder.filters(…​) methods

New Features and Improvements

JUnit Jupiter

Bug Fixes

Deprecations and Breaking Changes

  • The following deprecated APIs have been removed:

    • MethodOrderer.Alphanumeric class

    • InvocationInterceptor.interceptDynamicTest(Invocation, ExtensionContext) method

  • The deprecated junit.jupiter.tempdir.scope configuration parameter is no longer supported.

  • The JRE enum constants for JAVA_8 to JAVA_16 have been deprecated because they can no longer be used at runtime since JAVA_17 is the new baseline. Please also manually update any values used with the minVersion and maxVersion attributes in @EnabledForJreRange and @DisabledForJreRange or the versions attributes in @EnabledOnJre and @DisabledOnJre to ensure that you are no longer declaring version values less than 17.

  • @EnabledForJreRange and @DisabledForJreRange now use JAVA_17 as their default min value.

  • The contracts for the Executable parameters of Kotlin-specific assertTimeout functions were changed from callsInPlace(executable, EXACTLY_ONCE) to callsInPlace(executable, AT_MOST_ONCE) which might result in compilation errors.

New Features and Improvements

  • Kotlin’s suspend modifier may now be applied to test and lifecycle methods.

  • The Arguments interface for parameterized tests is now officially a @FunctionalInterface.

JUnit Vintage

Bug Fixes

Deprecations and Breaking Changes

New Features and Improvements

5.13.0

Date of Release: May 30, 2025

Scope:

  • Introduce @ClassTemplate and @ParameterizedClass support in JUnit Jupiter

  • Access to ParameterInfo for JUnit Jupiter extensions

  • New @SentenceFragment annotation for use with IndicativeSentences display name generator

  • Add --redirect-stdout and --redirect-stderr options to ConsoleLauncher

  • 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.properties files 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 has been rewritten to no longer require JUnit classes to be initialized at build time. Therefore, JUnit’s JARs no longer ship with native-image.properties files that contain --initialize-at-build-time options (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.

JUnit Platform

Bug Fixes

  • Notify LauncherDiscoveryListener implementation registered via LaucherConfig or on the Launcher of selectorProcessed events.

  • Reintroduce support for JVM shutdown hooks when using the -cp/--classpath option of the ConsoleLauncher. Prior to this release, the created class loader was closed prior to JVM shutdown hooks being invoked, which caused hooks to fail with a ClassNotFoundException when loading classes during shutdown.

Deprecations and Breaking Changes

New Features and Improvements

  • Introduce a mechanism for TestEngine implementations to report issues encountered during test discovery. If an engine reports a DiscoveryIssue with a Severity equal 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 to ERROR. 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 @Suite classes:

    • Invalid @Suite class declarations (for example, when private)

    • Invalid @BeforeSuite/@AfterSuite method declarations (for example, when not static)

    • Cyclic dependencies between @Suite classes

  • Introduce resource management mechanism that allows preparing and sharing state across executions or test engines via stores that are scoped to a LauncherSession or ExecutionRequest. The Jupiter API uses these stores as ancestors to the Store instances accessible via ExtensionContext and 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 ConsoleLauncher options --redirect-stdout and --redirect-stderr for redirecting stdout and stderr output 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 EngineTestKit to ease testing for discovery issues produced by a TestEngine. Please refer to the User Guide for details.

  • Make validation of including EngineFilters more 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 autoCloseArguments attribute in @ParameterizedTest is set to true, all arguments returned by registered ArgumentsProvider implementations are now closed even if the test method declares fewer parameters.

  • AutoCloseable arguments returned by an ArgumentsProvider are now closed even if they are wrapped with Named.

  • AutoCloseable arguments returned by an ArgumentsProvider are now closed even if a failure happens prior to invoking the parameterized method.

  • Validate all versions specified in @EnabledOnJre and @DisabledOnJre annotations.

Deprecations and Breaking Changes

New Features and Improvements

  • New @ClassTemplate annotation and ClassTemplateInvocationContextProvider API that allow declaring a top-level or @Nested test 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 BeforeClassTemplateInvocationCallback and AfterClassTemplateInvocationCallback extension callback interfaces allow implementing extensions that are invoked before and after each invocation of a class template.

  • New @ParameterizedClass support that builds on @ClassTemplate and allows declaring a top-level or @Nested test class as a parameterized test class to be invoked multiple times with different arguments. The same @…​Source annotations supported with @ParameterizedTest may be used to provide arguments via constructor or field injection. Please refer to the User Guide for details.

  • New @ParameterizedClass-specific @BeforeParameterizedClassInvocation/@AfterParameterizedClassInvocation lifecycle methods that are invoked once before/after each invocation of the parameterized class.

  • Provide access to the parameters and resolved arguments of a @ParameterizedTest or @ParameterizedClass by storing ParameterInfo in the ExtensionContext.Store for retrieval by other extensions. Please refer to the Javadoc for details.

  • New @SentenceFragment annotation which allows one to supply custom text for individual sentence fragments when using the IndicativeSentences DisplayNameGenerator. See the updated documentation in the User Guide for an example.

  • New TestTemplateInvocationContext.prepareInvocation(ExtensionContext) callback method which allows extensions to prepare the ExtensionContext before the test template method is invoked. This may be used, for example, to store entries in the ExtensionContext.Store to benefit from its cleanup support or for retrieval by other extensions.

  • Start reporting discovery issues for potentially problematic test classes:

    • Invalid @Test and @TestTemplate method declarations (for example, when return type is not void)

    • Invalid @TestFactory methods (for example, when return type is invalid)

    • Multiple method-level annotations (for example, @Test and @TestTemplate)

    • Invalid test class and @Nested class declarations (for example, static @Nested classes)

    • Potentially missing @Nested annotations (for example, non-abstract inner classes that contain test methods)

    • Invalid lifecycle method declarations (for example, when private)

    • Invalid @Tag syntax

    • Blank @DisplayName declarations

    • Blank @SentenceFragment declarations

    • @BeforeParameterizedClassInvocation and @AfterParameterizedClassInvocation methods declared in non-parameterized test classes

  • By default, AutoCloseable objects put into ExtensionContext.Store are now treated like instances of CloseableResource (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.Locale arguments 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 @ParameterizedClass test classes and @ParameterizedTest methods as suppressed exception for earlier failures.

  • Add support for Kotlin Sequence to @MethodSource, @FieldSource, and @TestFactory.

JUnit Vintage

No changes.