[[release-notes-5.5.0]]
== 5.5.0

*Date of Release:* June 30, 2019

*Scope:*

* Declarative `@Timeout` support
* New `InvocationInterceptor` extension API
* New `LifecycleMethodExecutionExceptionHandler` extension API
* Deprecation of script-based conditions (`@EnabledIf` and `@DisabledIf`)
* Configurable test discovery implementation for `TestEngine` authors
* Explicit Java module descriptors
* Various minor improvements and bug fixes

For a complete list of all _closed_ issues and pull requests for this release, consult the
link:{junit5-repo}+/milestone/34?closed=1+[5.5 M1],
link:{junit5-repo}+/milestone/37?closed=1+[5.5 RC1],
link:{junit5-repo}+/milestone/41?closed=1+[5.5 RC2], and
link:{junit5-repo}+/milestone/40?closed=1+[5.4 GA] milestone pages in the JUnit repository
on GitHub.


[[release-notes-5.5.0-junit-platform]]
=== JUnit Platform

==== New Features and Improvements

* Configurable test discovery implementation that can be reused by different test engines
  (see Javadoc of the `{junit-platform-engine-support-discovery}` package).
* New `isFinal()` and `isNotFinal()` methods in `ModifierSupport`.

==== Bug Fixes

* A custom `ClassLoader` created for additional `--class-path` entries passed to the
  `ConsoleLauncher` will now be closed after usage to gracefully free file handles.

==== Deprecations and Breaking Changes

* The internal `PreconditionViolationException` class in concealed package
  `org.junit.platform.commons.util` is now deprecated and has been replaced by an
  exception class with the same name in exported package `org.junit.platform.commons`.

==== New Features and Improvements

* `AnnotationSupport.findRepeatableAnnotations()` now finds repeatable annotations used as
  meta-annotations on other repeatable annotations.
* New `AnnotationSupport.findRepeatableAnnotations()` variant that accepts a
  `java.util.Optional<? extends AnnotatedElement>` argument.
* An exception thrown by a `TestExecutionListener` no longer causes test execution to
  abort. Instead, such exceptions will be logged as warnings now.
* New `MethodSource.from()` variant that accepts `String, String, Class<?>...` as
  arguments.


[[release-notes-5.5.0-junit-jupiter]]
=== JUnit Jupiter

==== Bug Fixes

* Execution of dynamic tests registered via a `@TestFactory` method no longer results in
  an `OutOfMemoryError` if the executables in the dynamic tests retain references to
  objects consuming large amounts of memory. Technically speaking, JUnit Jupiter no longer
  retains references to instances of `DynamicTest` after they have been executed.
* Extensions registered programmatically using `@RegisterExtension` on fields of test
  classes now work correctly for tests in contained `@Nested` test classes. Previously,
  such extensions were registered multiple times for each test method in `@Nested` classes.

==== Deprecations and Breaking Changes

* Script-based condition APIs and their supporting implementations are deprecated with the
  intent to remove them in JUnit Jupiter 5.6. Users should instead rely on a combination
  of other built-in conditions or create and use a custom implementation of
  `ExecutionCondition` to support the same conditions.

==== New Features and Improvements

* Support for declarative timeouts using `@Timeout` or configuration parameters (see
  <<../user-guide/index.adoc#writing-tests-declarative-timeouts, User Guide>> for details).
* The `JRE` enum used with `@EnabledOnJre` and `@DisabledOnJre` now supports Java 14.
* Expected and actual values are now supplied for failed `boolean` assertions for enhanced
  IDE and reporting support -- for example, when `assertTrue()` or `assertFalse()` fails.
* New overloaded variants of `Assertions.assertLinesMatch(...)` that accept a `String` or
  a `Supplier<String>` for a custom failure message.
* Failure messages for `Assertions.assertLinesMatch(...)` now emit each expected and
  actual line in a dedicated line.
* New Kotlin-friendly `assertDoesNotThrow()`, `assertTimeout()`, and
  `assertTimeoutPreemptively()` assertions have been added as top-level functions in the
  `org.junit.jupiter.api` package.
* Parameterized tests now support implicit conversion from a `String` to the following
  `java.time` types: `Duration`, `Period`, `MonthDay`, `ZoneId`, and `ZoneOffset`.
* `@ValueSource` now additionally supports literal values of type `boolean` for
  parameterized tests.
* New `emptyValue` attribute in `@CsvSource` and `@CsvFileSource`.
* Display names for test methods generated by the `ReplaceUnderscores`
  `DisplayNameGenerator` no longer include empty parentheses for test methods that do not
  declare any parameters.
* New `junit.jupiter.displayname.generator.default` configuration parameter to set the
  default `DisplayNameGenerator` that will be used unless `@DisplayName` or
  `@DisplayNameGeneration` is present.
* New `junit.jupiter.execution.parallel.mode.classes.default` configuration parameter
  allows to run top-level classes in parallel but their methods sequentially or vice versa
  (see <<../user-guide/index.adoc#writing-tests-parallel-execution, User Guide>> for
  details).
* `MethodOrderer.Random` now generates a default random seed only once and prints it to
  the log in order to allow reproducible builds.
* Methods ordered with `MethodOrderer.Random` now execute using the `SAME_THREAD`
  concurrency mode instead of the `CONCURRENT` mode when no custom seed is provided.
* The declared field type for an extension registered via `@RegisterExtension` is no
  longer required to implement an `Extension` API. It is now sufficient if the extension
  implementation can be assigned to the declared field type. This provides extension
  authors greater flexibility as well as the ability to hide implementation details of the
  user facing extension API.
* Private fields annotated with `@RegisterExtension` are no longer silently ignored.
  Instead the corresponding test class or test method will now fail with an exception
  informing the user of the configuration error.
* New `InvocationInterceptor` extension API (see
  <<../user-guide/index.adoc#extensions-intercepting-invocations, User Guide>> for
  details).
* New `LifecycleMethodExecutionExceptionHandler` extension API for handling exceptions
  thrown during the execution of `@BeforeAll`, `@BeforeEach`, `@AfterEach`, and
  `@AfterAll` lifecycle methods (see
  <<../user-guide/index.adoc#extensions-exception-handling, User Guide>> for details).
* All methods in the `TestWatcher` API are now interface `default` methods with empty
  implementations.
* A custom test source for a `DynamicContainer` or `DynamicTest` may now be a method URI
  -- for example, `method:org.example.MyTestClass#myTestMethod()`.
* A new `getOrDefault()` convenience method has been added to `ExtensionContext.Store`.


[[release-notes-5.5.0-junit-vintage]]
=== JUnit Vintage

==== New Features and Improvements

* `junit:junit` is now a compile-scoped dependency of `junit-vintage-engine` to allow for
  easier dependency management in Maven POMs.
* A method that is `public` is now preferred over other methods with the same name in the
  same test class when creating a `MethodSource` for a JUnit 4 `Description`.
