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

Date of Release: September 30, 2025

Scope:

  • Java 17 and Kotlin 2.2 baseline

  • Single version number for Platform, Jupiter, and Vintage

  • Use of JSpecify annotations to express nullability

  • Integration of JFR functionality in junit-platform-launcher

  • Removal of junit-platform-runner and junit-platform-jfr

  • Deterministic order of @Nested classes

  • MethodOrderer.Default and ClassOrderer.Default for @Nested classes

  • Inheritance of @TestMethodOrder by enclosed @Nested classes

  • Switch to FastCSV library for @CsvSource and @CsvFileSource

  • Support for using Kotlin suspend functions as test methods

  • New --fail-fast mode for ConsoleLauncher

  • Support for cancelling test execution via CancellationToken

  • Removal of various deprecated behaviors and APIs

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

Migration Guide

Please refer to the wiki for guidance on upgrading from JUnit 5.x.y to 6.0.0.

Overall Improvements

Deprecations and Breaking Changes

  • Minimum required Java version is now 17.

  • Minimum required Kotlin version is now 2.2.

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

New Features and Improvements

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

JUnit Platform

Deprecations and Breaking Changes

  • Support for running the ConsoleLauncher without specifying a subcommand has been removed.

  • Support for non-conventional ConsoleLauncher options such as --h (rather than -h) or -help (rather than --help) has been removed.

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

  • The junit-platform-jfr module which provided custom Java Flight Recorder (JFR) events for test discovery and execution has been removed. The functionality is now available directly in the junit-platform-launcher module.

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

  • 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

    • @UseTechnicalNames annotation for suites

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

  • Support for "legacy semantics" for field and method searches that used to be configurable via the junit.platform.reflection.search.useLegacySemantics system property has been removed. JUnit now always adheres to standard Java semantics regarding whether a given field or method is visible or overridden according to the rules of the Java language.

  • The type bounds of the following methods have been changed to be more flexible and allow nullable and non-nullable types:

    • ConfigurationParameters.get(String, Function)

    • NamespacedHierarchicalStore.getOrComputeIfAbsent(N, K, Function)

    • NamespacedHierarchicalStore.getOrComputeIfAbsent(N, K, Function, Class)

  • The junit-platform-suite-commons module has been removed. Its functionality is now integrated directly in the junit-platform-suite module.

  • ConversionSupport now converts String to Locale using the IETF BCP 47 language tag format supported by the Locale.forLanguageTag(String) factory method instead of the format used by the deprecated Locale(String) constructor.

  • All getOrComputeIfAbsent(…​) methods in NamespacedHierarchicalStore have been deprecated in favor of the new computeIfAbsent(…​) methods.

  • Setting an invalid value for one of the following enum-based configuration parameters now causes test discovery to fail:

    • junit.platform.discovery.issue.failure.phase

    • junit.platform.discovery.issue.severity.critical

  • The methods findNestedClasses(…​) and streamNestedClasses(…​) in ReflectionSupport now return nested classes, which are declared in the same enclosing class or interface, ordered in a deterministic but intentionally nonobvious way.

  • Serialization support for TestIdentifier has been changed in a backwards-incompatible way in order to simplify the implementation.

New Features and Improvements

  • New Launcher.execute(LauncherExecutionRequest) API with corresponding LauncherExecutionRequestBuilder to enable the addition of parameters to test executions in the future without additional overloads of execute(…​).

  • New discoveryRequest() method in LauncherDiscoveryRequestBuilder (analogous to executionRequest(…​) in LauncherExecutionRequestBuilder), which is an alias for the existing request() method and is intended to be used via a static import.

  • New LauncherDiscoveryRequestBuilder.forExecution() method which serves as a convenience for constructing a LauncherExecutionRequest that contains a LauncherDiscoveryRequest.

  • New selectClasses(…​) and selectClassesByName(…​) factory methods have been introduced in DiscoverySelectors to simplify use cases where one needs to select multiple individual test classes for the Launcher or EngineTestKit.

  • New selectors(List) builder method for EngineTestKit which can be used in conjunction with the new selectClasses(…​) and selectClassesByName(…​) factory methods in DiscoverySelectors.

  • New support for cancelling a running test execution via a CancellationToken passed to the Launcher as part of a LauncherExecutionRequest and from there to all registered test engines. Please refer to the User Guide for details and a usage example.

  • Passing the --fail-fast option to the execute subcommand of the ConsoleLauncher now causes test execution to be cancelled after the first failed test.

  • Cancellation support for implementations of HierarchicalTestEngine such as JUnit Jupiter, Spock, and Cucumber.

  • Cancellation support for the @Suite test engine.

  • New TestTask.getTestDescriptor() method for use in HierarchicalTestExecutorService implementations.

  • New computeIfAbsent(…​) methods in NamespacedHierarchicalStore to simplify working with non-nullable types.

  • Convention-based conversion in ConversionSupport now supports factory methods and factory constructors that accept a single CharSequence argument in addition to the existing support for factories that accept a single String argument.

  • Non-printable control characters in display names are now replaced with alternative representations. For example, \n is replaced with <LF>. This applies to all display names in JUnit Jupiter, @SuiteDisplayName, and any other test engines that subclass AbstractTestDescriptor. Please refer to the User Guide for details.

  • Stack traces are now pruned up to the test method or lifecycle method.

JUnit Jupiter

Bug Fixes

  • CSV headers are now properly supported with the default display name pattern and the explicit {argumentsWithNames} display name pattern for parameterized tests that utilize the useHeadersInDisplayName flag in @CsvSource and @CsvFileSource. Specifically, the parameter name is no longer duplicated in the display name when a CSV header is desired instead.

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.

  • For consistency with test methods, @Nested classes declared in the same enclosing class or interface are now ordered in a deterministic but intentionally nonobvious way.

  • The junit-jupiter-migrationsupport module and its contained classes are now deprecated and will be removed in the next major version.

  • As a result of migrating from univocity-parsers to FastCSV for @CsvSource and @CsvFileSource, root causes and messages of exceptions thrown for malformed CSV input may differ in some cases. While the overall parsing behavior remains consistent, this may affect custom error handling that relies on specific exception types or messages.

  • The lineSeparator attribute in @CsvFileSource has been removed. The line separator is now automatically detected, meaning that any of \r, \n, or \r\n is treated as a line separator.

  • Attributes such as ignoreLeadingAndTrailingWhitespace, nullValues, and others in @CsvSource and @CsvFileSource now apply to header fields as well as to regular fields.

  • Extra characters after a closing quote are no longer allowed in @CsvSource and @CsvFileSource. For example, if a single quote is used as the quote character, the following CSV value 'foo’INVALID,'bar' will now cause an exception to be thrown. This helps ensure that malformed input is not silently accepted or misinterpreted.

  • Support for the junit.jupiter.params.arguments.conversion.locale.format configuration parameter has been removed. Locale conversions are now always performed using the IETF BCP 47 language tag format supported by the Locale.forLanguageTag(String) factory method.

  • The return type of the provideTestTemplateInvocationContexts(ExtensionContext) method in the TestTemplateInvocationContextProvider interface has been changed from Stream<TestTemplateInvocationContext> to Stream<? extends TestTemplateInvocationContext>.

  • The type bounds of the following methods have been changed to be more flexible and allow nullable and non-nullable types:

    • ExtensionContext.getConfigurationParameter(String, Function)

    • ExtensionContext.getOrComputeIfAbsent(K, Function)

    • ExtensionContext.getOrComputeIfAbsent(K, Function, Class)

  • All getOrComputeIfAbsent(…​) methods in ExtensionContext.Store are now deprecated in favor of the new computeIfAbsent(…​) methods.

  • Setting an invalid value for one of the following enum-based configuration parameters now causes test discovery or execution to fail:

    • junit.jupiter.execution.parallel.mode.default

    • junit.jupiter.execution.parallel.mode.classes.default

    • junit.jupiter.execution.timeout.mode

    • junit.jupiter.execution.timeout.thread.mode.default

    • junit.jupiter.extensions.testinstantiation.extensioncontextscope.default

    • junit.jupiter.tempdir.cleanup.mode.default

    • junit.jupiter.testinstance.lifecycle.default

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

New Features and Improvements

  • Non-printable control characters in display names are now replaced with alternative representations. Please refer to the User Guide for details.

  • For consistency with @TestClassOrder, @TestMethodOrder annotations specified on a test class are now inherited by its @Nested inner classes, recursively.

  • New MethodOrderer.Default and ClassOrderer.Default types for reverting back to default ordering on a @Nested class and its @Nested inner classes when an enclosing class specifies a different orderer via @TestMethodOrder or @TestClassOrder, respectively.

  • The implementation of @CsvSource and @CsvFileSource has been migrated from the no longer maintained univocity-parsers to FastCSV. This improves the consistency of CSV input handling, especially for malformed entries, and provides better error reporting and overall performance.

  • Display names for @ParameterizedClass and @ParameterizedTest now consistently style name-value pairs for arguments using name = value formatting – for example, fruit = apple instead of fruit=apple.

  • Text-based arguments in display names for parameterized tests are now quoted by default. In addition, special characters are escaped within quoted text. Please refer to the User Guide for details.

  • Fallback String-to-Object Conversion for parameterized tests now supports factory methods and factory constructors that accept a single CharSequence argument in addition to the existing support for factories that accept a single String argument.

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

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

  • New computeIfAbsent(…​) methods in ExtensionContext.Store to simplify working with non-nullable types.

  • Reason strings supplied to ConditionEvaluationResult APIs are now officially declared as @Nullable.

JUnit Vintage

Deprecations and Breaking Changes

  • The JUnit Vintage test engine is now deprecated and will report an INFO level discovery issue if it finds at least one JUnit 4 test class. The deprecation warning is intended to clarify the purpose of the engine: it should only be used temporarily while migrating tests to JUnit Jupiter or another testing framework with native JUnit Platform support.

New Features and Improvements

  • Cancellation support for the Vintage test engine.

5.14.0

Date of Release: September 30, 2025

Scope:

  • Bug fixes and enhancements since 5.13.x

  • Deprecations along with new APIs to ease migration to JUnit 6

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

For complete details consult the 5.14.0 Release Notes online.