Add junit-6-migration module: JUnit 5.14.4 vs 6.1.3, API diff and behaviour probes

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01YPgGH6aMbSLANL3E2HHmS6
This commit is contained in:
2026-10-25 18:46:52 +00:00
co-authored by Claude Sonnet 5.5
parent 8fc8bc934f
commit 820318be7d
22 changed files with 1018 additions and 0 deletions
+2
View File
@@ -5,9 +5,11 @@ Runnable companion code for the testing posts on [ankurm.com](https://ankurm.com
| Module | Post | Stack |
|---|---|---|
| [`mockito/`](mockito) | Mockito 5 Deep Dive: Static, Final and Constructor Mocking, ArgumentCaptor and Strict Stubs | Mockito 5.24.0, JUnit 6.1.3, JDK 25 |
| [`junit-6-migration/`](junit-6-migration) | JUnit 5 to 6 Migration: What Was Removed, What Changed and How to Upgrade | JUnit 5.14.4 and 6.1.3, JDK 25 |
Every module keeps the real output of its tests in `output/`. Each test writes the transcript and asserts the same facts, so the numbers in the posts fail the build if they stop being true.
```bash
cd mockito && ./scripts/run-all.sh
cd ../junit-6-migration && ./scripts/run-all.sh
```
+32
View File
@@ -0,0 +1,32 @@
# junit-6-migration
Companion module for the ankurm.com article on **migrating from JUnit 5 to JUnit 6**. The same tests run on JUnit 5.14.4 and 6.1.3, and the two
releases are compared jar against jar. Nothing here is copied from release notes: each file in `output/` was produced by running something.
## Versions
| Component | Version | Notes |
|---|---|---|
| JUnit (before) | `5.14.4` Jupiter / `1.14.4` Platform | last 5.x release on Maven Central at the time of writing |
| JUnit (after) | `6.1.3` | Jupiter, Platform and Vintage all share this one number |
| JUnit 4 | `4.13.2` | only for the Vintage check |
| Java | build on `25`, `--release 17` | JUnit 6 jars need Java 17 |
## Run
```bash
./scripts/run-all.sh
```
## Output
| File | What it shows |
|---|---|
| `01-versions-and-baseline.txt` | version numbers and the Java level of each jar's class files |
| `02-removed-api.txt` | public classes and members in 5.14.4 that are not in 6.1.3, and whether 5.14.4 had deprecated them |
| `03-csv-behaviour-<version>.txt` | one set of `@CsvSource` and `@CsvFileSource` cases run on each version |
| `04-vintage-junit4-<version>.txt` | a JUnit 4 test run through the Vintage engine on each version |
| `05-old-apis-<version>.txt` | what the compiler says about three deprecated 5.x APIs on each version |
| `06-fixed-apis-<version>.txt` | the replacements compile on both versions |
`pom.xml` has two profiles, `junit5` and `junit6`, that change nothing but `junit.version`.
@@ -0,0 +1,11 @@
artifact 5.x jar 6.x jar
junit-jupiter-api 5.14.4 (Java 8) 6.1.3 (Java 17)
junit-jupiter-engine 5.14.4 (Java 8) 6.1.3 (Java 17)
junit-jupiter-params 5.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-commons 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-engine 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-launcher 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-suite-api 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-suite-engine 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-platform-testkit 1.14.4 (Java 8) 6.1.3 (Java 17)
junit-vintage-engine 5.14.4 (Java 8) 6.1.3 (Java 17)
+318
View File
@@ -0,0 +1,318 @@
== junit-jupiter-api: public classes removed: 6, members removed from classes that remain: 8, new classes: 64
class org.junit.jupiter.api.Assertions$TimeoutFailureFactory [NOT deprecated in 5.x]
class org.junit.jupiter.api.AssertionsKt$assertDoesNotThrow$3 [NOT deprecated in 5.x]
class org.junit.jupiter.api.AssertionsKt$assertThrows$4 [NOT deprecated in 5.x]
class org.junit.jupiter.api.AssertionsKt$evaluateAndWrap$1 [NOT deprecated in 5.x]
class org.junit.jupiter.api.AssertionsKt$evaluateAndWrap$2 [NOT deprecated in 5.x]
class org.junit.jupiter.api.MethodOrderer$Alphanumeric [deprecated in 5.x]
member org.junit.jupiter.api.Assertions: public static <T extends java.lang.Object, E extends java.lang.Throwable> T assertTimeoutPreemptively(java.time.Duration, org.junit.jupiter.api.function.ThrowingSupplier<T>, java.util.function.Supplier<java.lang.String>, org.junit.jupiter.api.Assertions$TimeoutFailureFactory<E>) throws E [NOT deprecated in 5.x]
member org.junit.jupiter.api.AssertionsKt: public static final <R extends java.lang.Object> org.junit.jupiter.api.function.ThrowingSupplier<R> evaluateAndWrap(kotlin.jvm.functions.Function0<? extends R>) [NOT deprecated in 5.x]
member org.junit.jupiter.api.extension.ExtensionContext: public abstract <T extends java.lang.Object> java.util.Optional<T> getConfigurationParameter(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.jupiter.api.extension.ExtensionContext$Store: public abstract <K extends java.lang.Object, V extends java.lang.Object> java.lang.Object getOrComputeIfAbsent(K, java.util.function.Function<K, V>) [NOT deprecated in 5.x]
member org.junit.jupiter.api.extension.ExtensionContext$Store: public abstract <K extends java.lang.Object, V extends java.lang.Object> V getOrComputeIfAbsent(K, java.util.function.Function<K, V>, java.lang.Class<V>) [NOT deprecated in 5.x]
member org.junit.jupiter.api.extension.InvocationInterceptor: public default void interceptDynamicTest(org.junit.jupiter.api.extension.InvocationInterceptor$Invocation<java.lang.Void>, org.junit.jupiter.api.extension.ExtensionContext) throws java.lang.Throwable [deprecated in 5.x]
member org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider: public abstract java.util.stream.Stream<org.junit.jupiter.api.extension.TestTemplateInvocationContext> provideTestTemplateInvocationContexts(org.junit.jupiter.api.extension.ExtensionContext) [NOT deprecated in 5.x]
member org.junit.jupiter.api.io.TempDir: public static final java.lang.String SCOPE_PROPERTY_NAME [deprecated in 5.x]
== junit-jupiter-engine: public classes removed: 0, members removed from classes that remain: 30, new classes: 17
member org.junit.jupiter.engine.Constants: public static final java.lang.String TEMP_DIR_SCOPE_PROPERTY_NAME [deprecated in 5.x]
member org.junit.jupiter.engine.config.CachingJupiterConfiguration: public <T extends java.lang.Object> java.util.Optional<T> getRawConfigurationParameter(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.DefaultJupiterConfiguration: public org.junit.jupiter.engine.config.DefaultJupiterConfiguration(org.junit.platform.engine.ConfigurationParameters, org.junit.platform.engine.OutputDirectoryCreator) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.DefaultJupiterConfiguration: public <T extends java.lang.Object> java.util.Optional<T> getRawConfigurationParameter(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.EnumConfigurationParameterConverter: public E get(java.lang.String, java.util.function.Function<java.lang.String, java.util.Optional<java.lang.String>>, E) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String EXTENSIONS_AUTODETECTION_INCLUDE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String EXTENSIONS_AUTODETECTION_EXCLUDE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEACTIVATE_CONDITIONS_PATTERN_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String PARALLEL_EXECUTION_ENABLED_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String CLOSING_STORED_AUTO_CLOSEABLE_ENABLED_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_EXECUTION_MODE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_CLASSES_EXECUTION_MODE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String EXTENSIONS_AUTODETECTION_ENABLED_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String EXTENSIONS_TIMEOUT_THREAD_DUMP_ENABLED_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_TEST_INSTANCE_LIFECYCLE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_DISPLAY_NAME_GENERATOR_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_TEST_METHOD_ORDER_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_TEST_CLASS_ORDER_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public static final java.lang.String DEFAULT_TEST_INSTANTIATION_EXTENSION_CONTEXT_SCOPE_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.engine.config.JupiterConfiguration: public abstract <T extends java.lang.Object> java.util.Optional<T> getRawConfigurationParameter(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.descriptor.ClassTestDescriptor: public org.junit.platform.engine.support.hierarchical.Node$ExecutionMode getExecutionMode() [NOT deprecated in 5.x]
member org.junit.jupiter.engine.descriptor.JupiterTestDescriptor: public org.junit.platform.engine.support.hierarchical.Node$ExecutionMode getExecutionMode() [NOT deprecated in 5.x]
member org.junit.jupiter.engine.discovery.AbstractOrderingVisitor$DescriptorWrapperOrderer: protected static <ORDERER extends java.lang.Object, WRAPPER extends java.lang.Object> org.junit.jupiter.engine.discovery.AbstractOrderingVisitor$DescriptorWrapperOrderer<ORDERER, WRAPPER> noop() [NOT deprecated in 5.x]
member org.junit.jupiter.engine.discovery.AbstractOrderingVisitor$MessageGenerator: public abstract java.lang.String generateMessage(int) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.discovery.DiscoverySelectorResolver: public org.junit.jupiter.engine.discovery.DiscoverySelectorResolver() [NOT deprecated in 5.x]
member org.junit.jupiter.engine.discovery.DiscoverySelectorResolver: public void resolveSelectors(org.junit.platform.engine.EngineDiscoveryRequest, org.junit.jupiter.engine.descriptor.JupiterEngineDescriptor) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.execution.NamespaceAwareStore: public <K extends java.lang.Object, V extends java.lang.Object> java.lang.Object getOrComputeIfAbsent(K, java.util.function.Function<K, V>) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.execution.NamespaceAwareStore: public <K extends java.lang.Object, V extends java.lang.Object> V getOrComputeIfAbsent(K, java.util.function.Function<K, V>, java.lang.Class<V>) [NOT deprecated in 5.x]
member org.junit.jupiter.engine.execution.ParameterResolutionUtils: public org.junit.jupiter.engine.execution.ParameterResolutionUtils() [NOT deprecated in 5.x]
member org.junit.jupiter.engine.support.JupiterThrowableCollectorFactory: public org.junit.jupiter.engine.support.JupiterThrowableCollectorFactory() [NOT deprecated in 5.x]
== junit-jupiter-params: public classes removed: 198, members removed from classes that remain: 5, new classes: 81
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.BooleanString [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Convert [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Copy [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.EnumOptions [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.FixedWidth [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Format [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.HeaderTransformer [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Headers [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.LowerCase [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Nested [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.NullString [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Parsed [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Replace [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Trim [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.UpperCase [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.Validate [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.AnnotationHelper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.AnnotationRegistry [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.FieldMapping [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.MethodDescriptor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.MethodFilter [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers.TransformedHeader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.AbstractParser [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.AbstractWriter [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ArgumentUtils [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ColumnMap [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.CommonParserSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.CommonSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.CommonWriterSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.Context [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ContextSnapshot [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ContextWrapper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ConversionProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.DataProcessingException [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.DataValidationException [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.DefaultContext [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.DefaultConversionProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.DefaultParsingContext [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.Format [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.IterableResult [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.NoopProcessorErrorHandler [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.NormalizedString [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ParserOutput [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ParsingContext [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ParsingContextSnapshot [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ParsingContextWrapper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ProcessorErrorHandler [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.ResultIterator [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.RetryableErrorHandler [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.RowProcessorErrorHandler [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.StringCache [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.TextParsingException [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.TextWritingException [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.beans.BeanHelper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.beans.PropertyWrapper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.AllIndexesSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.ColumnMapper [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.ColumnMapping [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.ExcludeFieldEnumSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.ExcludeFieldIndexSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.ExcludeFieldNameSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldConversionMapping [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldEnumSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldIndexSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldNameSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields.FieldSet [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.AbstractCharInputReader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.BomInput [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.BomInput$BytesProcessedNotification [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.CharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.CharInput [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.CharInputReader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.DefaultCharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.DefaultCharInputReader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.EOFException [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.ElasticCharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.ExpandingCharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.InputAnalysisProcess [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.LineSeparatorDetector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.LookaheadCharInputReader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.NoopCharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.WriterCharAppender [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.concurrent.ConcurrentCharInputReader [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.iterators.RecordIterator [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.iterators.RowIterator [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.AbstractRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.BatchedColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.BatchedObjectColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.BeanListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.BeanProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.BeanWriterProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.CompositeRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ConcurrentRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.CustomMatcher [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.InputValueSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MasterDetailListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MasterDetailProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MasterDetailRecord [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MultiBeanListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MultiBeanProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.MultiBeanRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.NoopRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ObjectColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ObjectRowListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ObjectRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.ObjectRowWriterProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.OutputValueSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowPlacement [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowProcessorSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowWriterProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.RowWriterProcessorSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractBatchedColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractBatchedObjectColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractBeanListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractBeanProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractConcurrentProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractInputValueSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractMasterDetailListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractMasterDetailProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractMultiBeanListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractMultiBeanProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractMultiBeanRowProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractObjectColumnProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractObjectListProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractObjectProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.AbstractProcessorSwitch [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.BeanConversionProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.ColumnOrderDependent [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.CompositeProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.NoopProcessor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core.Processor [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.record.AbstractRecordFactory [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.record.Record [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.record.RecordFactory [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.record.RecordMetaData [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.routine.AbstractRoutines [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.common.routine.InputDimension [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.BigDecimalConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.BigIntegerConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.BooleanConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.ByteConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.CalendarConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.CharacterConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.Conversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.Conversions [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.DateConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.DoubleConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.EnumConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.EnumSelector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.FloatConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.FormattedBigDecimalConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.FormattedConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.FormattedDateConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.IntegerConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.LongConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.LowerCaseConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.NullConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.NullStringConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.NumericConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.ObjectConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.RegexConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.ShortConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.ToStringConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.TrimConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.UpperCaseConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.ValidatedConversion [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.conversions.Validator [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.Csv [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvFormat [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvFormatDetector [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvParser [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvParserSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvRoutines [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvWriter [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.CsvWriterSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.csv.UnescapedQuoteHandling [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FieldAlignment [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthFieldLengths [deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthFields [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthFormat [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthParser [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthParserSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthRoutines [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthWriter [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.fixed.FixedWidthWriterSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvFormat [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvParser [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvParserSettings [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvRoutines [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvWriter [NOT deprecated in 5.x]
class org.junit.jupiter.params.shadow.com.univocity.parsers.tsv.TsvWriterSettings [NOT deprecated in 5.x]
member org.junit.jupiter.params.ResolutionCache$Concurrent: public java.lang.Object resolve(org.junit.jupiter.params.support.ParameterDeclaration, java.util.function.Supplier<java.lang.Object>) [NOT deprecated in 5.x]
member org.junit.jupiter.params.aggregator.DefaultArgumentsAccessor: public static org.junit.jupiter.params.aggregator.DefaultArgumentsAccessor create(org.junit.jupiter.api.extension.ExtensionContext, int, java.lang.ClassLoader, java.lang.Object[]) [NOT deprecated in 5.x]
member org.junit.jupiter.params.converter.DefaultArgumentConverter: public static final java.lang.String DEFAULT_LOCALE_CONVERSION_FORMAT_PROPERTY_NAME [NOT deprecated in 5.x]
member org.junit.jupiter.params.converter.DefaultArgumentConverter: public org.junit.jupiter.params.converter.DefaultArgumentConverter(org.junit.jupiter.api.extension.ExtensionContext) [NOT deprecated in 5.x]
member org.junit.jupiter.params.provider.CsvFileSource: public abstract java.lang.String lineSeparator() [NOT deprecated in 5.x]
== junit-platform-commons: public classes removed: 2, members removed from classes that remain: 13, new classes: 16
class org.junit.platform.commons.util.BlacklistedExceptions [deprecated in 5.x]
class org.junit.platform.commons.util.PreconditionViolationException [deprecated in 5.x]
member org.junit.platform.commons.support.ReflectionSupport: public static java.util.Optional<java.lang.Class<?>> loadClass(java.lang.String) [deprecated in 5.x]
member org.junit.platform.commons.util.CollectionUtils: public static <T extends java.lang.Object> java.util.Set<T> toSet(T[]) [NOT deprecated in 5.x]
member org.junit.platform.commons.util.CollectionUtils: public static <T extends java.lang.Object> java.util.stream.Collector<T, ?, java.util.List<T>> toUnmodifiableList() [NOT deprecated in 5.x]
member org.junit.platform.commons.util.KotlinReflectionUtils: public org.junit.platform.commons.util.KotlinReflectionUtils() [NOT deprecated in 5.x]
member org.junit.platform.commons.util.ModuleUtils: public org.junit.platform.commons.util.ModuleUtils() [NOT deprecated in 5.x]
member org.junit.platform.commons.util.ModuleUtils: public static boolean isJavaPlatformModuleSystemAvailable() [NOT deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static <T extends java.lang.Object> java.util.Optional<java.lang.Object> readFieldValue(java.lang.Class<T>, java.lang.String, T) [deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.Optional<java.lang.Object> readFieldValue(java.lang.reflect.Field) [deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.Optional<java.lang.Object> readFieldValue(java.lang.reflect.Field, java.lang.Object) [deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.List<java.lang.Object> readFieldValues(java.util.List<java.lang.reflect.Field>, java.lang.Object) [NOT deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.List<java.lang.Object> readFieldValues(java.util.List<java.lang.reflect.Field>, java.lang.Object, java.util.function.Predicate<java.lang.reflect.Field>) [NOT deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.Optional<java.lang.Class<?>> loadClass(java.lang.String) [deprecated in 5.x]
member org.junit.platform.commons.util.ReflectionUtils: public static java.util.Optional<java.lang.Class<?>> loadClass(java.lang.String, java.lang.ClassLoader) [deprecated in 5.x]
== junit-platform-engine: public classes removed: 3, members removed from classes that remain: 29, new classes: 36
class org.junit.platform.engine.support.filter.ClasspathScanningSupport [deprecated in 5.x]
class org.junit.platform.engine.support.hierarchical.SingleTestExecutor [deprecated in 5.x]
class org.junit.platform.engine.support.hierarchical.SingleTestExecutor$Executable [NOT deprecated in 5.x]
member org.junit.platform.engine.ConfigurationParameters: public default <T extends java.lang.Object> java.util.Optional<T> get(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.platform.engine.ConfigurationParameters: public abstract int size() [deprecated in 5.x]
member org.junit.platform.engine.ExecutionRequest: public static org.junit.platform.engine.ExecutionRequest create(org.junit.platform.engine.TestDescriptor, org.junit.platform.engine.EngineExecutionListener, org.junit.platform.engine.ConfigurationParameters, org.junit.platform.engine.OutputDirectoryCreator, org.junit.platform.engine.support.store.NamespacedHierarchicalStore<org.junit.platform.engine.support.store.Namespace>) [NOT deprecated in 5.x]
member org.junit.platform.engine.UniqueId: public final java.util.Optional<java.lang.String> getEngineId() [NOT deprecated in 5.x]
member org.junit.platform.engine.UniqueId: public final java.util.List<org.junit.platform.engine.UniqueId$Segment> getSegments() [NOT deprecated in 5.x]
member org.junit.platform.engine.UniqueId: public final org.junit.platform.engine.UniqueId append(java.lang.String, java.lang.String) [NOT deprecated in 5.x]
member org.junit.platform.engine.UniqueId: public final org.junit.platform.engine.UniqueId append(org.junit.platform.engine.UniqueId$Segment) [NOT deprecated in 5.x]
member org.junit.platform.engine.discovery.MethodSelector: public java.lang.String getMethodParameterTypes() [deprecated in 5.x]
member org.junit.platform.engine.discovery.NestedMethodSelector: public java.lang.String getMethodParameterTypes() [deprecated in 5.x]
member org.junit.platform.engine.reporting.ReportEntry: public org.junit.platform.engine.reporting.ReportEntry() [deprecated in 5.x]
member org.junit.platform.engine.support.config.PrefixedConfigurationParameters: public <T extends java.lang.Object> java.util.Optional<T> get(java.lang.String, java.util.function.Function<java.lang.String, T>) [NOT deprecated in 5.x]
member org.junit.platform.engine.support.config.PrefixedConfigurationParameters: public int size() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.ClassSource: public final java.lang.String getClassName() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.ClassSource: public final java.lang.Class<?> getJavaClass() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.ClassSource: public final java.util.Optional<org.junit.platform.engine.support.descriptor.FilePosition> getPosition() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.ClasspathResourceSource: public final java.util.Optional<org.junit.platform.engine.support.descriptor.FilePosition> getPosition() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.CompositeTestSource: public final java.util.List<org.junit.platform.engine.TestSource> getSources() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.DirectorySource: public final java.net.URI getUri() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.DirectorySource: public final java.io.File getFile() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.FileSource: public final java.net.URI getUri() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.FileSource: public final java.io.File getFile() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.FileSource: public final java.util.Optional<org.junit.platform.engine.support.descriptor.FilePosition> getPosition() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.MethodSource: public final java.lang.String getMethodName() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.MethodSource: public final java.lang.String getMethodParameterTypes() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.MethodSource: public final java.lang.Class<?> getJavaClass() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.MethodSource: public final java.lang.reflect.Method getJavaMethod() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.descriptor.PackageSource: public final java.lang.String getPackageName() [NOT deprecated in 5.x]
member org.junit.platform.engine.support.store.NamespacedHierarchicalStore: public <K extends java.lang.Object, V extends java.lang.Object> java.lang.Object getOrComputeIfAbsent(N, K, java.util.function.Function<K, V>) [NOT deprecated in 5.x]
member org.junit.platform.engine.support.store.NamespacedHierarchicalStore: public <K extends java.lang.Object, V extends java.lang.Object> V getOrComputeIfAbsent(N, K, java.util.function.Function<K, V>, java.lang.Class<V>) throws org.junit.platform.engine.support.store.NamespacedHierarchicalStoreException [NOT deprecated in 5.x]
== junit-platform-launcher: public classes removed: 1, members removed from classes that remain: 5, new classes: 28
class org.junit.platform.launcher.listeners.LegacyReportingUtils [deprecated in 5.x]
member org.junit.platform.launcher.TestPlan: public void add(org.junit.platform.launcher.TestIdentifier) [deprecated in 5.x]
member org.junit.platform.launcher.TestPlan: public java.util.Set<org.junit.platform.launcher.TestIdentifier> getChildren(java.lang.String) [deprecated in 5.x]
member org.junit.platform.launcher.core.EngineExecutionOrchestrator: public void execute(org.junit.platform.launcher.core.LauncherDiscoveryResult, org.junit.platform.engine.EngineExecutionListener, org.junit.platform.launcher.TestExecutionListener, org.junit.platform.engine.support.store.NamespacedHierarchicalStore<org.junit.platform.engine.support.store.Namespace>) [NOT deprecated in 5.x]
member org.junit.platform.launcher.core.EngineExecutionOrchestrator: public void execute(org.junit.platform.launcher.core.LauncherDiscoveryResult, org.junit.platform.engine.EngineExecutionListener, org.junit.platform.engine.support.store.NamespacedHierarchicalStore<org.junit.platform.engine.support.store.Namespace>) [NOT deprecated in 5.x]
member org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder: public org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder() [deprecated in 5.x]
== junit-platform-suite-api: public classes removed: 1, members removed from classes that remain: 0, new classes: 1
class org.junit.platform.suite.api.UseTechnicalNames [deprecated in 5.x]
== junit-platform-suite-engine: public classes removed: 0, members removed from classes that remain: 0, new classes: 4
== junit-platform-testkit: public classes removed: 0, members removed from classes that remain: 3, new classes: 2
member org.junit.platform.testkit.engine.EngineTestKit: public static org.junit.platform.testkit.engine.EngineExecutionResults execute(java.lang.String, org.junit.platform.engine.EngineDiscoveryRequest) [deprecated in 5.x]
member org.junit.platform.testkit.engine.EngineTestKit: public static org.junit.platform.testkit.engine.EngineExecutionResults execute(org.junit.platform.engine.TestEngine, org.junit.platform.engine.EngineDiscoveryRequest) [deprecated in 5.x]
member org.junit.platform.testkit.engine.EngineTestKit$Builder: public org.junit.platform.testkit.engine.EngineTestKit$Builder filters(org.junit.platform.engine.DiscoveryFilter<?>...) [deprecated in 5.x]
== junit-vintage-engine: public classes removed: 0, members removed from classes that remain: 4, new classes: 6
member org.junit.vintage.engine.descriptor.VintageEngineDescriptor: public java.util.Set<org.junit.platform.engine.TestDescriptor> getModifiableChildren() [NOT deprecated in 5.x]
member org.junit.vintage.engine.execution.RunnerExecutor: public org.junit.vintage.engine.execution.RunnerExecutor(org.junit.platform.engine.EngineExecutionListener) [NOT deprecated in 5.x]
member org.junit.vintage.engine.execution.VintageExecutor: public org.junit.vintage.engine.execution.VintageExecutor(org.junit.vintage.engine.descriptor.VintageEngineDescriptor, org.junit.platform.engine.EngineExecutionListener, org.junit.platform.engine.ExecutionRequest) [NOT deprecated in 5.x]
member org.junit.vintage.engine.execution.VintageExecutor: public void executeAllChildren() [NOT deprecated in 5.x]
@@ -0,0 +1,19 @@
JUnit 5.14.4
FAILED [method] columnLongerThanLimit(String, int) -> CsvParsingException: Failed to parse CSV input configured via @org.junit.jupiter.params.provider.CsvSource(emptyValue="", delimiter...
SUCCESSFUL [1] x, 1
SUCCESSFUL [2] y, 2
SUCCESSFUL [1] apple, 1
SUCCESSFUL [2] a,b, 2
SUCCESSFUL [3] padded, 3
SUCCESSFUL [4] , 4
SUCCESSFUL [5] null, 5
SUCCESSFUL [6] NIL, 6
SUCCESSFUL [7] it's, 7
SUCCESSFUL [8] "dq", 8
SUCCESSFUL [1] name = widget, qty = 4
SUCCESSFUL [2] name = multi word, qty = 5
SUCCESSFUL [1] one, 1
SUCCESSFUL [2] two, with comma, 2
SUCCESSFUL [3] line
break, 3
SUCCESSFUL [1] a
@@ -0,0 +1,18 @@
JUnit 6.1.3
FAILED [method] columnLongerThanLimit(String, int) -> CsvParsingException: Failed to parse CSV input configured via @org.junit.jupiter.params.provider.CsvSource(emptyValue="", delimiter...
SUCCESSFUL [1] "x", "1"
SUCCESSFUL [2] "y", "2"
SUCCESSFUL [1] "apple", "1"
SUCCESSFUL [2] "a,b", "2"
SUCCESSFUL [3] "padded", "3"
SUCCESSFUL [4] "", "4"
SUCCESSFUL [5] null, "5"
SUCCESSFUL [6] "NIL", "6"
SUCCESSFUL [7] "it's", "7"
SUCCESSFUL [8] "\"dq\"", "8"
SUCCESSFUL [1] name = "widget", qty = "4"
SUCCESSFUL [2] name = "multi word", qty = "5"
SUCCESSFUL [1] "one", "1"
SUCCESSFUL [2] "two, with comma", "2"
SUCCESSFUL [3] "line\nbreak", "3"
SUCCESSFUL [1] "a"
@@ -0,0 +1,2 @@
JUnit 5.14.4
SUCCESSFUL stillRuns
@@ -0,0 +1,2 @@
JUnit 6.1.3
SUCCESSFUL stillRuns
@@ -0,0 +1,40 @@
JUnit 5.14.4, compiling OldApis.java
src/compat/OldApis.java:1: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.MethodOrderer;
^
src/compat/OldApis.java:2: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.Test;
^
src/compat/OldApis.java:3: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.TestMethodOrder;
^
src/compat/OldApis.java:4: error: package org.junit.jupiter.api.io does not exist
import org.junit.jupiter.api.io.TempDir;
^
src/compat/OldApis.java:5: error: package org.junit.platform.commons.support does not exist
import org.junit.platform.commons.support.ReflectionSupport;
^
src/compat/OldApis.java:8: error: cannot find symbol
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
^
symbol: class TestMethodOrder
src/compat/OldApis.java:8: error: package MethodOrderer does not exist
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
^
src/compat/OldApis.java:11: error: cannot find symbol
@Test
^
symbol: class Test
location: class OldApis
src/compat/OldApis.java:13: error: cannot find symbol
Object loaded = ReflectionSupport.loadClass("java.lang.String");
^
symbol: variable ReflectionSupport
location: class OldApis
src/compat/OldApis.java:14: error: cannot find symbol
String property = TempDir.SCOPE_PROPERTY_NAME;
^
symbol: variable TempDir
location: class OldApis
10 errors
javac exit status: 1
@@ -0,0 +1,40 @@
JUnit 6.1.3, compiling OldApis.java
src/compat/OldApis.java:1: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.MethodOrderer;
^
src/compat/OldApis.java:2: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.Test;
^
src/compat/OldApis.java:3: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.TestMethodOrder;
^
src/compat/OldApis.java:4: error: package org.junit.jupiter.api.io does not exist
import org.junit.jupiter.api.io.TempDir;
^
src/compat/OldApis.java:5: error: package org.junit.platform.commons.support does not exist
import org.junit.platform.commons.support.ReflectionSupport;
^
src/compat/OldApis.java:8: error: cannot find symbol
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
^
symbol: class TestMethodOrder
src/compat/OldApis.java:8: error: package MethodOrderer does not exist
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
^
src/compat/OldApis.java:11: error: cannot find symbol
@Test
^
symbol: class Test
location: class OldApis
src/compat/OldApis.java:13: error: cannot find symbol
Object loaded = ReflectionSupport.loadClass("java.lang.String");
^
symbol: variable ReflectionSupport
location: class OldApis
src/compat/OldApis.java:14: error: cannot find symbol
String property = TempDir.SCOPE_PROPERTY_NAME;
^
symbol: variable TempDir
location: class OldApis
10 errors
javac exit status: 1
@@ -0,0 +1,32 @@
JUnit 5.14.4, compiling FixedApis.java
src/compat/FixedApis.java:1: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.MethodOrderer;
^
src/compat/FixedApis.java:2: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.Test;
^
src/compat/FixedApis.java:3: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.TestMethodOrder;
^
src/compat/FixedApis.java:4: error: package org.junit.platform.commons.support does not exist
import org.junit.platform.commons.support.ReflectionSupport;
^
src/compat/FixedApis.java:7: error: cannot find symbol
@TestMethodOrder(MethodOrderer.MethodName.class)
^
symbol: class TestMethodOrder
src/compat/FixedApis.java:7: error: package MethodOrderer does not exist
@TestMethodOrder(MethodOrderer.MethodName.class)
^
src/compat/FixedApis.java:10: error: cannot find symbol
@Test
^
symbol: class Test
location: class FixedApis
src/compat/FixedApis.java:12: error: cannot find symbol
Object loaded = ReflectionSupport.tryToLoadClass("java.lang.String").toOptional().orElseThrow();
^
symbol: variable ReflectionSupport
location: class FixedApis
8 errors
javac exit status: 1
@@ -0,0 +1,32 @@
JUnit 6.1.3, compiling FixedApis.java
src/compat/FixedApis.java:1: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.MethodOrderer;
^
src/compat/FixedApis.java:2: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.Test;
^
src/compat/FixedApis.java:3: error: package org.junit.jupiter.api does not exist
import org.junit.jupiter.api.TestMethodOrder;
^
src/compat/FixedApis.java:4: error: package org.junit.platform.commons.support does not exist
import org.junit.platform.commons.support.ReflectionSupport;
^
src/compat/FixedApis.java:7: error: cannot find symbol
@TestMethodOrder(MethodOrderer.MethodName.class)
^
symbol: class TestMethodOrder
src/compat/FixedApis.java:7: error: package MethodOrderer does not exist
@TestMethodOrder(MethodOrderer.MethodName.class)
^
src/compat/FixedApis.java:10: error: cannot find symbol
@Test
^
symbol: class Test
location: class FixedApis
src/compat/FixedApis.java:12: error: cannot find symbol
Object loaded = ReflectionSupport.tryToLoadClass("java.lang.String").toOptional().orElseThrow();
^
symbol: variable ReflectionSupport
location: class FixedApis
8 errors
javac exit status: 1
+84
View File
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ankurm</groupId>
<artifactId>junit-6-migration</artifactId>
<version>1.0.0</version>
<name>junit-6-migration</name>
<description>The same tests run on JUnit 5.14.4 and JUnit 6.1.3, plus an API diff of the two releases</description>
<properties>
<maven.compiler.release>17</maven.compiler.release>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- default is the new version; -Pjunit5 switches the whole build to 5.14.4 -->
<junit.version>6.1.3</junit.version>
</properties>
<profiles>
<profile>
<id>junit5</id>
<properties>
<junit.version>5.14.4</junit.version>
</properties>
</profile>
<profile>
<id>junit6</id>
<properties>
<junit.version>6.1.3</junit.version>
</properties>
</profile>
</profiles>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit</groupId>
<artifactId>junit-bom</artifactId>
<version>${junit.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<systemPropertyVariables>
<junit.version>${junit.version}</junit.version>
</systemPropertyVariables>
</configuration>
</plugin>
</plugins>
</build>
</project>
+159
View File
@@ -0,0 +1,159 @@
#!/usr/bin/env python3
"""Compare the public API of JUnit 5.14.4 / Platform 1.14.4 against JUnit 6.1.3 straight from the jars.
Writes output/01-versions-and-baseline.txt and output/02-removed-api.txt.
Needs a JDK (javap) on PATH or via JAVA_HOME, and access to Maven Central.
"""
import collections
import os
import pathlib
import re
import subprocess
import time
import urllib.error
import urllib.request
import zipfile
ROOT = pathlib.Path(__file__).resolve().parent.parent
JARS = ROOT / "target" / "jars"
OUT = ROOT / "output"
JAVAP = os.path.join(os.environ["JAVA_HOME"], "bin", "javap") if os.environ.get("JAVA_HOME") else "javap"
OLD, NEW, PLATFORM_OLD = "5.14.4", "6.1.3", "1.14.4"
ARTIFACTS = [
("jupiter", "junit-jupiter-api"), ("jupiter", "junit-jupiter-engine"), ("jupiter", "junit-jupiter-params"),
("platform", "junit-platform-commons"), ("platform", "junit-platform-engine"), ("platform", "junit-platform-launcher"),
("platform", "junit-platform-suite-api"), ("platform", "junit-platform-suite-engine"), ("platform", "junit-platform-testkit"),
("vintage", "junit-vintage-engine"),
]
def version_for(group, which):
if which == "new":
return NEW
return PLATFORM_OLD if group == "platform" else OLD
def fetch(url, dest):
if dest.exists():
return
for _ in range(8):
try:
with urllib.request.urlopen(url) as r:
dest.write_bytes(r.read())
return
except urllib.error.HTTPError as e:
if e.code != 429:
raise
time.sleep(4)
raise RuntimeError("rate limited: " + url)
def jar(group, artifact, which):
v = version_for(group, which)
dest = JARS / f"{artifact}-{v}.jar"
fetch(f"https://repo1.maven.org/maven2/org/junit/{group}/{artifact}/{v}/{artifact}-{v}.jar", dest)
return dest
def classes(path):
with zipfile.ZipFile(path) as z:
return sorted(n[:-6].replace("/", ".") for n in z.namelist()
if n.endswith(".class") and not n.endswith("module-info.class") and "META-INF" not in n)
def major(path):
with zipfile.ZipFile(path) as z:
name = next(n for n in z.namelist()
if n.endswith(".class") and not n.endswith("module-info.class") and "META-INF" not in n)
b = z.read(name)
return int.from_bytes(b[6:8], "big")
MEMBER = re.compile(r"^ ((?:public|protected)[^;]*);$")
def dump(path):
"""One javap call per jar. Returns {class: (is_public, class_deprecated, {member signature: deprecated?})}."""
names = [c for c in classes(path) if ".internal." not in c]
result = {}
# javap takes many class names at once; split the list to keep the command line short
for i in range(0, len(names), 150):
chunk = names[i:i + 150]
p = subprocess.run([JAVAP, "-v", "-protected", "-cp", str(path)] + chunk, capture_output=True, text=True)
cur_cls = None
for block in re.split(r"(?m)^Classfile ", p.stdout)[1:]:
lines = block.splitlines()
header = lines[0]
cls = re.search(r"!/(.*)\.class", header).group(1).replace("/", ".")
public = False
cls_dep = False
members, cur, in_pool, seen_flags = {}, None, False, False
for line in lines[1:]:
if not seen_flags and line.startswith(" flags:"):
public = "ACC_PUBLIC" in line
seen_flags = True
if line.startswith("Constant pool:"):
in_pool = True
continue
if in_pool:
if line.startswith("{"):
in_pool = False
continue
m = MEMBER.match(line)
if m:
cur = " ".join(m.group(1).split())
members[cur] = False
continue
if line.strip() == "Deprecated: true":
if cur is None:
cls_dep = True
else:
members[cur] = True
if line.startswith("}"):
cur = None
if re.search(r"^Deprecated: true", block, re.M):
cls_dep = True
result[cls] = (public, cls_dep, members)
return result
def main():
JARS.mkdir(parents=True, exist_ok=True)
OUT.mkdir(parents=True, exist_ok=True)
versions = [f"{'artifact':<34} {'5.x jar':<28} {'6.x jar':<28}"]
removed_classes = collections.defaultdict(list)
removed_members = collections.defaultdict(list)
added = collections.Counter()
for group, art in ARTIFACTS:
old, new = jar(group, art, "old"), jar(group, art, "new")
mo, mn = major(old), major(new)
versions.append(f"{art:<34} {version_for(group, 'old')} (Java {mo - 44}){'':<9} {NEW} (Java {mn - 44})")
do, dn = dump(old), dump(new)
co, cn = set(classes(old)), set(classes(new))
for c in sorted(co - cn):
if c in do and do[c][0]:
removed_classes[art].append((c, do[c][1]))
added[art] = len(cn - co)
for c in sorted(do):
if c in dn and do[c][0]:
for sig, dep in do[c][2].items():
if sig not in dn[c][2]:
removed_members[art].append((c, sig, dep))
(OUT / "01-versions-and-baseline.txt").write_text("\n".join(versions) + "\n")
lines = []
for _, art in ARTIFACTS:
lines.append(f"== {art}: public classes removed: {len(removed_classes[art])}, "
f"members removed from classes that remain: {len(removed_members[art])}, "
f"new classes: {added[art]}")
for c, dep in removed_classes[art]:
lines.append(f" class {c} [{'deprecated in 5.x' if dep else 'NOT deprecated in 5.x'}]")
for c, sig, dep in removed_members[art]:
lines.append(f" member {c}: {sig} [{'deprecated in 5.x' if dep else 'NOT deprecated in 5.x'}]")
(OUT / "02-removed-api.txt").write_text("\n".join(lines) + "\n")
print("\n".join(versions))
print("\n".join(l for l in lines if l.startswith("==")))
if __name__ == "__main__":
main()
+23
View File
@@ -0,0 +1,23 @@
#!/usr/bin/env bash
# Compiles src/compat/OldApis.java against the JUnit 5.14.4 jars and then the 6.1.3 jars and records the compiler's answer.
# Run scripts/api_diff.py first: it downloads the jars into target/jars.
set -uo pipefail
cd "$(dirname "$0")/.."
unset JAVA_TOOL_OPTIONS
mkdir -p output target/compat
J=target/jars
[ -f "$J/apiguardian-api-1.1.2.jar" ] || curl -sSf --retry 5 -o "$J/apiguardian-api-1.1.2.jar" \
https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar
compile() { # $1 = label, $2 = jupiter version, $3 = platform version
for src in OldApis:05-old-apis FixedApis:06-fixed-apis; do
{
echo "JUnit $2, compiling ${src%%:*}.java"
javac -Xlint:deprecation --release 17 -d "target/compat/$1" \
-cp "$J/junit-jupiter-api-$2.jar:$J/junit-platform-commons-$3.jar:$J/apiguardian-api-1.1.2.jar" "src/compat/${src%%:*}.java" 2>&1 \
| sed -e '/^Picked up/d'
echo "javac exit status: ${PIPESTATUS[0]}"
} > "output/${src##*:}-$2.txt"
done
}
compile junit5 5.14.4 1.14.4
compile junit6 6.1.3 6.1.3
+11
View File
@@ -0,0 +1,11 @@
#!/usr/bin/env bash
# Regenerates every file in output/. Needs JDK 17+ (built with 25), Maven 3.9 and access to Maven Central.
set -euo pipefail
cd "$(dirname "$0")/.."
unset JAVA_TOOL_OPTIONS
python3 scripts/api_diff.py >/dev/null # 01, 02: jar-to-jar API diff (also downloads the jars)
mvn -B -q clean test -Pjunit5 # 03, 04 on JUnit 5.14.4
mvn -B -q clean test -Pjunit6 # 03, 04 on JUnit 6.1.3
./scripts/compile-old-apis.sh # 05, 06
ls -1 output
@@ -0,0 +1,15 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.platform.commons.support.ReflectionSupport;
/** The replacements for OldApis. This compiles on 5.14.4 and on 6.1.3, so make these changes before you upgrade. */
@TestMethodOrder(MethodOrderer.MethodName.class)
class FixedApis {
@Test
void usesTheReplacements() {
Object loaded = ReflectionSupport.tryToLoadClass("java.lang.String").toOptional().orElseThrow();
System.out.println(loaded);
}
}
+17
View File
@@ -0,0 +1,17 @@
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.io.TempDir;
import org.junit.platform.commons.support.ReflectionSupport;
/** Compiled by scripts/compile-old-apis.sh against each JUnit version. Not part of the Maven build. */
@TestMethodOrder(MethodOrderer.Alphanumeric.class)
class OldApis {
@Test
void usesRemovedApis() {
Object loaded = ReflectionSupport.loadClass("java.lang.String");
String property = TempDir.SCOPE_PROPERTY_NAME;
System.out.println(loaded + " " + property);
}
}
@@ -0,0 +1,86 @@
package com.ankurm.junitmigration;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.junit.platform.engine.TestExecutionResult;
import org.junit.platform.launcher.TestExecutionListener;
import org.junit.platform.launcher.TestIdentifier;
import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
import org.junit.platform.launcher.core.LauncherFactory;
/**
* Runs the same probe classes on whichever JUnit is on the class path and writes what happened to
* output/NN-name-&lt;version&gt;.txt. The two versions are meant to give different answers in places, so this
* test records them instead of asserting them. It does assert that the probes ran at all.
*/
class BehaviourTest {
private static final String VERSION = System.getProperty("junit.version", "unknown");
@Test
void csvBehaviour() throws IOException {
List<String> lines = run(CsvProbe.class);
write("03-csv-behaviour", lines);
assertTrue(lines.size() > 10, "probe produced results");
}
@Test
void vintageStillRunsJUnit4() throws IOException {
List<String> lines = run(LegacyJUnit4Test.class);
write("04-vintage-junit4", lines);
assertTrue(lines.stream().anyMatch(l -> l.contains("stillRuns") && l.contains("SUCCESSFUL")), "junit 4 test ran");
}
private static List<String> run(Class<?> probe) {
List<String> lines = new ArrayList<>();
var request = LauncherDiscoveryRequestBuilder.request().selectors(selectClass(probe)).build();
var launcher = LauncherFactory.create();
launcher.execute(request, new TestExecutionListener() {
@Override
public void executionSkipped(TestIdentifier id, String reason) {
lines.add(String.format("%-11s %s -> %s", "SKIPPED", id.getDisplayName(), reason));
}
@Override
public void executionFinished(TestIdentifier id, TestExecutionResult result) {
// a parameterized method is a container: report it too when it fails as a whole
if (!id.isTest() && result.getStatus() == TestExecutionResult.Status.SUCCESSFUL) {
return;
}
if (!id.isTest() && id.getParentId().isEmpty()) {
return;
}
String outcome = result.getStatus().name();
String message = result.getThrowable().map(t -> " -> " + t.getClass().getSimpleName() + ": "
+ firstLine(t.getMessage())).orElse("");
lines.add(String.format("%-11s %s%s%s", outcome, id.isTest() ? "" : "[method] ", id.getDisplayName(), message));
}
});
return lines;
}
private static String firstLine(String s) {
if (s == null) {
return "";
}
String one = s.lines().findFirst().orElse("");
return one.length() > 110 ? one.substring(0, 110) + "..." : one;
}
private static void write(String name, List<String> lines) throws IOException {
Path dir = Path.of("output");
Files.createDirectories(dir);
List<String> out = new ArrayList<>();
out.add("JUnit " + VERSION);
out.addAll(lines);
Files.write(dir.resolve(name + "-" + VERSION + ".txt"), out);
}
}
@@ -0,0 +1,56 @@
package com.ankurm.junitmigration;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvFileSource;
import org.junit.jupiter.params.provider.CsvSource;
/**
* Not run by Surefire (the name does not end in Test). {@link BehaviourTest} launches it through the
* JUnit Platform Launcher and records what each invocation was called and whether it passed, on whichever
* JUnit version is on the class path.
*/
class CsvProbe {
@ParameterizedTest
@CsvSource({
"apple, 1",
"'a,b', 2",
" padded , 3",
"'', 4",
", 5",
"NIL, 6",
"'it''s', 7",
"\"dq\", 8"
})
void basicRows(String name, int n) {
}
@ParameterizedTest
@CsvSource(value = {"x;1", "y;2"}, delimiter = ';', useHeadersInDisplayName = false)
void customDelimiter(String name, int n) {
}
@ParameterizedTest
@CsvSource(textBlock = """
name, qty
widget, 4
'multi word', 5
""", useHeadersInDisplayName = true)
void textBlockWithHeader(String name, int qty) {
}
@ParameterizedTest
@CsvSource(value = {"a,b,c"})
void tooManyColumnsForParameters(String first) {
}
@ParameterizedTest
@CsvSource(value = {"1234567890,1"}, maxCharsPerColumn = 5)
void columnLongerThanLimit(String value, int n) {
}
@ParameterizedTest
@CsvFileSource(resources = "/probe.csv", numLinesToSkip = 1)
void fileRows(String name, int n) {
}
}
@@ -0,0 +1,14 @@
package com.ankurm.junitmigration;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
/** A JUnit 4 test. It is discovered by the Vintage engine, not by Jupiter. */
public class LegacyJUnit4Test {
@Test
public void stillRuns() {
assertEquals(4, 2 + 2);
}
}
@@ -0,0 +1,5 @@
name,n
one,1
"two, with comma",2
"line
break",3
1 name n
2 one 1
3 two, with comma 2
4 line break 3