From 390211be8f95fa475349b0699431ea7ab5107be7 Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Sun, 27 Sep 2020 14:05:24 +0200 Subject: [PATCH 01/10] Add Named interface and use it to wrap Arguments --- .../java/org/junit/jupiter/api/Named.java | 38 +++++++++++++++++++ .../params/ParameterizedTestExtension.java | 24 ++++++++++-- .../ParameterizedTestInvocationContext.java | 5 ++- .../ParameterizedTestParameterResolver.java | 11 +++--- 4 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java new file mode 100644 index 000000000000..290ee5f2bfb1 --- /dev/null +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java @@ -0,0 +1,38 @@ +/* + * Copyright 2015-2020 the original author or authors. + * + * All rights reserved. This program and the accompanying materials are + * made available under the terms of the Eclipse Public License v2.0 which + * accompanies this distribution and is available at + * + * https://www.eclipse.org/legal/epl-v20.html + */ + +package org.junit.jupiter.api; + +public interface Named { + + static Named of(String name, T payload) { + return new Named() { + @Override + public String getName() { + return name; + } + + @Override + public T getPayload() { + return payload; + } + + @Override + public String toString() { + return name; + } + }; + } + + String getName(); + + T getPayload(); + +} diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java index 65dde70187f4..ed6c00a06fa5 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java @@ -16,9 +16,12 @@ import java.lang.reflect.Method; import java.util.Arrays; +import java.util.List; import java.util.concurrent.atomic.AtomicLong; +import java.util.stream.Collectors; import java.util.stream.Stream; +import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ExtensionContext.Namespace; import org.junit.jupiter.api.extension.TestTemplateInvocationContext; @@ -31,6 +34,7 @@ import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.commons.util.Preconditions; import org.junit.platform.commons.util.ReflectionUtils; +import org.junit.platform.commons.util.StringUtils; /** * @since 5.0 @@ -88,6 +92,7 @@ public Stream provideTestTemplateInvocationContex .flatMap(provider -> arguments(provider, extensionContext)) .map(Arguments::get) .map(arguments -> consumedArguments(arguments, methodContext)) + .map(this::namedArguments) .map(arguments -> createInvocationContext(formatter, methodContext, arguments)) .peek(invocationContext -> invocationCount.incrementAndGet()) .onClose(() -> @@ -118,7 +123,7 @@ private ExtensionContext.Store getStore(ExtensionContext context) { } private TestTemplateInvocationContext createInvocationContext(ParameterizedTestNameFormatter formatter, - ParameterizedTestMethodContext methodContext, Object[] arguments) { + ParameterizedTestMethodContext methodContext, List> arguments) { return new ParameterizedTestInvocationContext(formatter, methodContext, arguments); } @@ -143,8 +148,21 @@ protected static Stream arguments(ArgumentsProvider provide private Object[] consumedArguments(Object[] arguments, ParameterizedTestMethodContext methodContext) { int parameterCount = methodContext.getParameterCount(); - return methodContext.hasAggregator() ? arguments - : (arguments.length > parameterCount ? Arrays.copyOf(arguments, parameterCount) : arguments); + if (methodContext.hasAggregator()) { + return arguments; + } + return arguments.length > parameterCount ? Arrays.copyOf(arguments, parameterCount) : arguments; + } + + private List> namedArguments(Object[] arguments) { + return Arrays.stream(arguments) // + .map(argument -> { + if (argument instanceof Named) { + return (Named) argument; + } + return Named.of(StringUtils.nullSafeToString(argument), argument); + }) // + .collect(Collectors.toList()); } } diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java index 47b40e6a893e..3f3dec174eaa 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java @@ -14,6 +14,7 @@ import java.util.List; +import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.TestTemplateInvocationContext; @@ -24,10 +25,10 @@ class ParameterizedTestInvocationContext implements TestTemplateInvocationContex private final ParameterizedTestNameFormatter formatter; private final ParameterizedTestMethodContext methodContext; - private final Object[] arguments; + private final List> arguments; ParameterizedTestInvocationContext(ParameterizedTestNameFormatter formatter, - ParameterizedTestMethodContext methodContext, Object[] arguments) { + ParameterizedTestMethodContext methodContext, List> arguments) { this.formatter = formatter; this.methodContext = methodContext; this.arguments = arguments; diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java index 970a75c6f16e..b6f20e685a8e 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java @@ -12,7 +12,9 @@ import java.lang.reflect.Executable; import java.lang.reflect.Method; +import java.util.List; +import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.api.extension.ParameterResolutionException; @@ -24,9 +26,9 @@ class ParameterizedTestParameterResolver implements ParameterResolver { private final ParameterizedTestMethodContext methodContext; - private final Object[] arguments; + private final List> arguments; - ParameterizedTestParameterResolver(ParameterizedTestMethodContext methodContext, Object[] arguments) { + ParameterizedTestParameterResolver(ParameterizedTestMethodContext methodContext, List> arguments) { this.methodContext = methodContext; this.arguments = arguments; } @@ -54,14 +56,13 @@ public boolean supportsParameter(ParameterContext parameterContext, ExtensionCon } // Else fallback to behavior for parameterized test methods without aggregators. - return parameterIndex < this.arguments.length; + return parameterIndex < this.arguments.size(); } @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - - return this.methodContext.resolve(parameterContext, this.arguments); + return this.methodContext.resolve(parameterContext, this.arguments.stream().map(Named::getPayload).toArray()); } } From 548898a018c20d66d76ed28906c625d1e12b3bb7 Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Sun, 25 Oct 2020 18:07:53 +0100 Subject: [PATCH 02/10] Suppress warning --- .../org/junit/jupiter/params/ParameterizedTestExtension.java | 1 + 1 file changed, 1 insertion(+) diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java index ed6c00a06fa5..9fa9efaa6a1c 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java @@ -154,6 +154,7 @@ private Object[] consumedArguments(Object[] arguments, ParameterizedTestMethodCo return arguments.length > parameterCount ? Arrays.copyOf(arguments, parameterCount) : arguments; } + @SuppressWarnings("unchecked") private List> namedArguments(Object[] arguments) { return Arrays.stream(arguments) // .map(argument -> { From 759a51228f5334daecdc4e90b63334b5cc5e3d6c Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Thu, 17 Dec 2020 21:53:23 +0100 Subject: [PATCH 03/10] Add integration test with MethodSource --- .../ParameterizedTestIntegrationTests.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java b/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java index fb106aa2faf3..d8e6e17e10f8 100644 --- a/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java +++ b/junit-jupiter-params/src/test/java/org/junit/jupiter/params/ParameterizedTestIntegrationTests.java @@ -46,6 +46,7 @@ import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Named; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; @@ -589,6 +590,15 @@ private EngineExecutionResults execute(String methodName, Class... methodPara methodParameterTypes); } + @Test + void namedParameters() { + execute("namedParameters", String.class).allEvents().assertThatEvents() // + .haveAtLeast(1, + event(test(), displayName("cool name"), finishedWithFailure(message("parameter value")))) // + .haveAtLeast(1, + event(test(), displayName("default name"), finishedWithFailure(message("default name")))); + } + } @Nested @@ -949,6 +959,12 @@ void streamOfTwoDimensionalObjectArrays(Object[][] array) { fail(Arrays.deepToString(array)); } + @MethodSourceTest + @Order(13) + void namedParameters(String string) { + fail(string); + } + // --------------------------------------------------------------------- static Stream emptyMethodSource() { @@ -1006,6 +1022,10 @@ static Stream streamOfTwoDimensionalObjectArrays() { new Object[][] { { "five", 6 }, { "seven", 8 } }); } + static Stream namedParameters() { + return Stream.of(arguments(Named.of("cool name", "parameter value")), arguments("default name")); + } + // --------------------------------------------------------------------- @MethodSourceTest From 59cc65ba6567d916aca59b12389a95e8d4622667 Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Sat, 9 Jan 2021 17:39:35 +0100 Subject: [PATCH 04/10] Use named arguments to format display names --- .../params/ParameterizedTestInvocationContext.java | 2 +- .../params/ParameterizedTestNameFormatter.java | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java index 3f3dec174eaa..263ad325f3ac 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java @@ -36,7 +36,7 @@ class ParameterizedTestInvocationContext implements TestTemplateInvocationContex @Override public String getDisplayName(int invocationIndex) { - return this.formatter.format(invocationIndex, this.arguments); + return this.formatter.format(invocationIndex, this.arguments.toArray()); } @Override diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java index 937e91f60103..5cccc2338463 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestNameFormatter.java @@ -21,6 +21,7 @@ import java.util.Arrays; import java.util.stream.IntStream; +import org.junit.jupiter.api.Named; import org.junit.platform.commons.JUnitException; import org.junit.platform.commons.util.StringUtils; @@ -56,12 +57,19 @@ String format(int invocationIndex, Object... arguments) { } private String formatSafely(int invocationIndex, Object[] arguments) { - String pattern = prepareMessageFormatPattern(invocationIndex, arguments); + Object[] namedArguments = extractNamedArguments(arguments); + String pattern = prepareMessageFormatPattern(invocationIndex, namedArguments); MessageFormat format = new MessageFormat(pattern); - Object[] humanReadableArguments = makeReadable(format, arguments); + Object[] humanReadableArguments = makeReadable(format, namedArguments); return format.format(humanReadableArguments); } + private Object[] extractNamedArguments(Object[] arguments) { + return Arrays.stream(arguments) // + .map(argument -> argument instanceof Named ? ((Named) argument).getName() : argument) // + .toArray(); + } + private String prepareMessageFormatPattern(int invocationIndex, Object[] arguments) { String result = pattern// .replace(DISPLAY_NAME_PLACEHOLDER, this.displayName)// From 161e3d4871c923664e619ba0052385580e89e832 Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Sat, 9 Jan 2021 18:09:48 +0100 Subject: [PATCH 05/10] Add release note entry --- .../src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc | 1 + 1 file changed, 1 insertion(+) diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc index 43601da40a94..12eb001b8344 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc @@ -65,6 +65,7 @@ on GitHub. provide better error messages comparable to those of `assertThrows`. * Dynamic tests now require less memory thanks to a number of improvements to internal data structures. +* In parameterized test with `@MethodSource` or `@ArgumentSource`, arguments can now have optional names. When the argument is included in the display name of an iteration, this name will be used instead of the value. [[release-notes-5.8.0-M1-junit-vintage]] === JUnit Vintage From 9528e6856826ab4eba68e0ae02dfd26ce6384f6c Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Mon, 11 Jan 2021 13:30:20 +0100 Subject: [PATCH 06/10] Add API annotation on Named --- .../src/main/java/org/junit/jupiter/api/Named.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java index 290ee5f2bfb1..6e767f6eb2f0 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java @@ -10,6 +10,11 @@ package org.junit.jupiter.api; +import static org.apiguardian.api.API.Status.EXPERIMENTAL; + +import org.apiguardian.api.API; + +@API(status = EXPERIMENTAL, since = "5.8") public interface Named { static Named of(String name, T payload) { From 4e28308a6581d4632c3dbf7c8fc419928e5c19bb Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Sat, 30 Jan 2021 11:01:03 +0100 Subject: [PATCH 07/10] Add documentation --- .../release-notes/release-notes-5.8.0-M1.adoc | 4 +++- .../docs/asciidoc/user-guide/writing-tests.adoc | 14 ++++++++++++++ .../test/java/example/ParameterizedTestDemo.java | 15 +++++++++++++++ .../main/java/org/junit/jupiter/api/Named.java | 9 +++++++-- 4 files changed, 39 insertions(+), 3 deletions(-) diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc index 12eb001b8344..3a98e9dc883c 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc @@ -65,7 +65,9 @@ on GitHub. provide better error messages comparable to those of `assertThrows`. * Dynamic tests now require less memory thanks to a number of improvements to internal data structures. -* In parameterized test with `@MethodSource` or `@ArgumentSource`, arguments can now have optional names. When the argument is included in the display name of an iteration, this name will be used instead of the value. +* In parameterized test with `@MethodSource` or `@ArgumentSource`, arguments can now have + optional names. When the argument is included in the display name of an iteration, this + name will be used instead of the value. [[release-notes-5.8.0-M1-junit-vintage]] === JUnit Vintage diff --git a/documentation/src/docs/asciidoc/user-guide/writing-tests.adoc b/documentation/src/docs/asciidoc/user-guide/writing-tests.adoc index 4e4500018543..a305eed26469 100644 --- a/documentation/src/docs/asciidoc/user-guide/writing-tests.adoc +++ b/documentation/src/docs/asciidoc/user-guide/writing-tests.adoc @@ -1580,6 +1580,20 @@ if they exceed the configured maximum length. The limit is configurable via the `junit.jupiter.params.displayname.argument.maxlength` configuration parameter and defaults to 512 characters. +When using `@MethodSource` or `@ArgumentSource`, you can give names to arguments. This +name will be used if the argument is included in the invocation display name, like in +the example below. + +[source,java,indent=0] +---- +include::{testDir}/example/ParameterizedTestDemo.java[tags=named_arguments] +---- + +.... +A parameterized test with named arguments ✔ +├─ 1: An important file ✔ +└─ 2: Another file ✔ +.... [[writing-tests-parameterized-tests-lifecycle-interop]] ==== Lifecycle and Interoperability diff --git a/documentation/src/test/java/example/ParameterizedTestDemo.java b/documentation/src/test/java/example/ParameterizedTestDemo.java index 40f440d305ee..23e5000841a5 100644 --- a/documentation/src/test/java/example/ParameterizedTestDemo.java +++ b/documentation/src/test/java/example/ParameterizedTestDemo.java @@ -19,6 +19,7 @@ import static org.junit.jupiter.params.provider.EnumSource.Mode.EXCLUDE; import static org.junit.jupiter.params.provider.EnumSource.Mode.MATCH_ALL; +import java.io.File; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -39,6 +40,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Named; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.TestInfo; import org.junit.jupiter.api.TestReporter; @@ -441,4 +443,17 @@ void testWithCustomAggregatorAnnotation(@CsvToPerson Person person) { void testWithCustomDisplayNames(String fruit, int rank) { } // end::custom_display_names[] + + // tag::named_arguments[] + @DisplayName("A parameterized test with named arguments") + @ParameterizedTest(name = "{index}: {0}") + @MethodSource("namedArguments") + void testWithNamedArguments(File file) { + } + + static Stream namedArguments() { + return Stream.of(arguments(Named.of("An important file", new File("path1"))), + arguments(Named.of("Another file", new File("path2")))); + } + // end::named_arguments[] } diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java index 6e767f6eb2f0..9000d892da4e 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java @@ -10,11 +10,16 @@ package org.junit.jupiter.api; -import static org.apiguardian.api.API.Status.EXPERIMENTAL; +import static org.apiguardian.api.API.Status.STABLE; import org.apiguardian.api.API; -@API(status = EXPERIMENTAL, since = "5.8") +/** + * {@code Named} is used to wrap an object and give it a name.. + * + * @param the type of the payload + */ +@API(status = STABLE, since = "5.8") public interface Named { static Named of(String name, T payload) { From b1cfce707610724b736209b7b11a98cb4bb3e988 Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Mon, 1 Feb 2021 09:44:49 +0100 Subject: [PATCH 08/10] Apply suggestions from code review Co-authored-by: Marc Philipp --- .../src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc | 2 +- .../src/main/java/org/junit/jupiter/api/Named.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc index 1767e70d176d..cbe30705d16a 100644 --- a/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc +++ b/documentation/src/docs/asciidoc/release-notes/release-notes-5.8.0-M1.adoc @@ -83,7 +83,7 @@ on GitHub. * Dynamic tests now require less memory thanks to a number of improvements to internal data structures. * Documented constant values in `org.junit.jupiter.api.parallel.Resources`. -* In parameterized test with `@MethodSource` or `@ArgumentSource`, arguments can now have +* In parameterized tests with `@MethodSource` or `@ArgumentSource`, arguments can now have optional names. When the argument is included in the display name of an iteration, this name will be used instead of the value. diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java index 9000d892da4e..715814132113 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java @@ -15,7 +15,7 @@ import org.apiguardian.api.API; /** - * {@code Named} is used to wrap an object and give it a name.. + * {@code Named} is used to wrap an object and give it a name. * * @param the type of the payload */ From 93327df61c9751f7c3cefbf374b19644075c05ad Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Mon, 1 Feb 2021 09:48:05 +0100 Subject: [PATCH 09/10] Fix copyright --- .../src/main/java/org/junit/jupiter/api/Named.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java index 715814132113..cd2b6cfbccd5 100644 --- a/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java +++ b/junit-jupiter-api/src/main/java/org/junit/jupiter/api/Named.java @@ -1,5 +1,5 @@ /* - * Copyright 2015-2020 the original author or authors. + * Copyright 2015-2021 the original author or authors. * * All rights reserved. This program and the accompanying materials are * made available under the terms of the Eclipse Public License v2.0 which From ca0f46eb2c0bd9062a48337016b1cb55d00c467d Mon Sep 17 00:00:00 2001 From: Juliette de Rancourt Date: Mon, 1 Feb 2021 10:52:29 +0100 Subject: [PATCH 10/10] Don't wrap arguments with Named in ParameterizedTestExtension --- .../params/ParameterizedTestExtension.java | 19 +--------------- .../ParameterizedTestInvocationContext.java | 7 +++--- .../ParameterizedTestParameterResolver.java | 22 ++++++++++++++----- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java index e2a218d48839..7d110ce37805 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestExtension.java @@ -16,12 +16,9 @@ import java.lang.reflect.Method; import java.util.Arrays; -import java.util.List; import java.util.concurrent.atomic.AtomicLong; -import java.util.stream.Collectors; import java.util.stream.Stream; -import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.api.extension.ExtensionContext.Namespace; import org.junit.jupiter.api.extension.TestTemplateInvocationContext; @@ -34,7 +31,6 @@ import org.junit.platform.commons.util.ExceptionUtils; import org.junit.platform.commons.util.Preconditions; import org.junit.platform.commons.util.ReflectionUtils; -import org.junit.platform.commons.util.StringUtils; /** * @since 5.0 @@ -92,7 +88,6 @@ public Stream provideTestTemplateInvocationContex .flatMap(provider -> arguments(provider, extensionContext)) .map(Arguments::get) .map(arguments -> consumedArguments(arguments, methodContext)) - .map(this::namedArguments) .map(arguments -> createInvocationContext(formatter, methodContext, arguments)) .peek(invocationContext -> invocationCount.incrementAndGet()) .onClose(() -> @@ -123,7 +118,7 @@ private ExtensionContext.Store getStore(ExtensionContext context) { } private TestTemplateInvocationContext createInvocationContext(ParameterizedTestNameFormatter formatter, - ParameterizedTestMethodContext methodContext, List> arguments) { + ParameterizedTestMethodContext methodContext, Object[] arguments) { return new ParameterizedTestInvocationContext(formatter, methodContext, arguments); } @@ -154,16 +149,4 @@ private Object[] consumedArguments(Object[] arguments, ParameterizedTestMethodCo return arguments.length > parameterCount ? Arrays.copyOf(arguments, parameterCount) : arguments; } - @SuppressWarnings("unchecked") - private List> namedArguments(Object[] arguments) { - return Arrays.stream(arguments) // - .map(argument -> { - if (argument instanceof Named) { - return (Named) argument; - } - return Named.of(StringUtils.nullSafeToString(argument), argument); - }) // - .collect(Collectors.toList()); - } - } diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java index cc3ba438985e..0746f24b33f4 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestInvocationContext.java @@ -14,7 +14,6 @@ import java.util.List; -import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.Extension; import org.junit.jupiter.api.extension.TestTemplateInvocationContext; @@ -25,10 +24,10 @@ class ParameterizedTestInvocationContext implements TestTemplateInvocationContex private final ParameterizedTestNameFormatter formatter; private final ParameterizedTestMethodContext methodContext; - private final List> arguments; + private final Object[] arguments; ParameterizedTestInvocationContext(ParameterizedTestNameFormatter formatter, - ParameterizedTestMethodContext methodContext, List> arguments) { + ParameterizedTestMethodContext methodContext, Object[] arguments) { this.formatter = formatter; this.methodContext = methodContext; this.arguments = arguments; @@ -36,7 +35,7 @@ class ParameterizedTestInvocationContext implements TestTemplateInvocationContex @Override public String getDisplayName(int invocationIndex) { - return this.formatter.format(invocationIndex, this.arguments.toArray()); + return this.formatter.format(invocationIndex, this.arguments); } @Override diff --git a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java index c0fd58f77ebf..6185897d9d02 100644 --- a/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java +++ b/junit-jupiter-params/src/main/java/org/junit/jupiter/params/ParameterizedTestParameterResolver.java @@ -12,7 +12,7 @@ import java.lang.reflect.Executable; import java.lang.reflect.Method; -import java.util.List; +import java.util.Arrays; import org.junit.jupiter.api.Named; import org.junit.jupiter.api.extension.ExtensionContext; @@ -26,9 +26,9 @@ class ParameterizedTestParameterResolver implements ParameterResolver { private final ParameterizedTestMethodContext methodContext; - private final List> arguments; + private final Object[] arguments; - ParameterizedTestParameterResolver(ParameterizedTestMethodContext methodContext, List> arguments) { + ParameterizedTestParameterResolver(ParameterizedTestMethodContext methodContext, Object[] arguments) { this.methodContext = methodContext; this.arguments = arguments; } @@ -56,13 +56,25 @@ public boolean supportsParameter(ParameterContext parameterContext, ExtensionCon } // Else fallback to behavior for parameterized test methods without aggregators. - return parameterIndex < this.arguments.size(); + return parameterIndex < this.arguments.length; } @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - return this.methodContext.resolve(parameterContext, this.arguments.stream().map(Named::getPayload).toArray()); + return this.methodContext.resolve(parameterContext, extractPayloads(this.arguments)); + } + + @SuppressWarnings("unchecked") + private Object[] extractPayloads(Object[] arguments) { + return Arrays.stream(arguments) // + .map(argument -> { + if (argument instanceof Named) { + return ((Named) argument).getPayload(); + } + return argument; + }) // + .toArray(); } }