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

Date of Release:

Scope:

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

JUnit Platform

Bug Fixes

Deprecations and Breaking Changes

  • Deprecate constructors for ForkJoinPoolHierarchicalTestExecutorService in favor of the new ParallelHierarchicalTestExecutorServiceFactory that also supports WorkerThreadPoolHierarchicalTestExecutorService.

New Features and Improvements

  • Support for creating a ModuleSelector from a java.lang.Module and using its classloader for test discovery.

  • New WorkerThreadPoolHierarchicalTestExecutorService implementation used for parallel test execution that is backed by a regular thread pool rather than a ForkJoinPool. Engine authors should switch to use ParallelHierarchicalTestExecutorServiceFactory rather than instantiating a concrete HierarchicalTestExecutorService implementation for parallel execution directly.

  • OpenTestReportGeneratingListener now supports redirecting XML events to a socket via the new junit.platform.reporting.open.xml.socket configuration parameter. When set to a port number, events are sent to 127.0.0.1:<port> instead of being written to a file.

  • Allow implementations of HierarchicalTestEngine to specify which nodes require the global read lock by overriding the Node.isGlobalReadLockRequired() method to return false.

JUnit Jupiter

Bug Fixes

Deprecations and Breaking Changes

New Features and Improvements

  • Introduce new dynamicTest(Consumer<? super Configuration>) factory method for dynamic tests. It allows configuring the ExecutionMode of the dynamic test in addition to its display name, test source URI, and executable.

  • Introduce new dynamicContainer(Consumer<? super Configuration>) factory method for dynamic containers. It allows configuring the ExecutionMode of the dynamic container and/or its children in addition to its display name, test source URI, and children.

  • Enrich assertInstanceOf failure using the test subject Throwable as cause. It results in the stack trace of the test subject Throwable to get reported along with the failure.

  • Make implementation of HierarchicalTestExecutorService used for parallel test execution configurable via the new junit.jupiter.execution.parallel.config.executor-service configuration parameter to in order to add support for WorkerThreadPoolHierarchicalTestExecutorService. Please refer to the User Guide for details.

JUnit Vintage

Bug Fixes

Deprecations and Breaking Changes

New Features and Improvements

6.0.1

Date of Release: October 31, 2025

Scope: Bug fixes and enhancements since 6.0.0

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

JUnit Platform

Bug Fixes

  • The jdk.jfr package is now an optional import when using the junit-platform-launcher as an OSGi bundle.

New Features and Improvements

  • Legacy documentation regarding Java 8 compatibility has been removed from the User Guide.

JUnit Jupiter

Bug Fixes

  • A regression introduced in version 6.0.0 caused an exception when using @CsvSource or @CsvFileSource if the delimiter or delimiterString attribute was set to #. This occurred because # was used as the default comment character without an option to change it. To resolve this, a new commentCharacter attribute has been added to both annotations. Its default value remains #, but it can now be customized to avoid conflicts with other control characters.

  • Fix IllegalAccessError thrown when using the Kotlin-specific assertDoesNotThrow assertion.

  • Stop reporting discovery issues for synthetic methods, particularly in conjunction with Kotlin suspend functions.

  • Fix support for test methods with the same signature as package-private methods declared in super classes in different packages.

Deprecations and Breaking Changes

  • The org.junit.jupiter.migrationsupport module descriptor has been marked as deprecated for removal.

New Features and Improvements

  • The @CsvSource and @CsvFileSource annotations now allow specifying a custom comment character using the new commentCharacter attribute.

  • Improve error message when @ParameterizedClass is used with field injection without providing enough arguments.

  • Allow calling the TypedArgumentConverter constructor for @Nullable T target types without having to cast class literals to Class<@Nullable T>.

JUnit Vintage

New Features and Improvements

  • Allow disabling the reporting of discovery issues by the JUnit Vintage engine (including the one reported for its deprecation) by setting the new junit.vintage.discovery.issue.reporting.enabled configuration parameter to false.

6.0.0

Date of Release: September 30, 2025

Scope:

  • Java 17 and Kotlin 2.1 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 complete details consult the 6.0.0 Release Notes online.