diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassBasedTestDescriptor.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassBasedTestDescriptor.java index 2eb71183bd28..91039207877d 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassBasedTestDescriptor.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassBasedTestDescriptor.java @@ -164,7 +164,7 @@ public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext conte this.beforeAllMethods.forEach(method -> registerExtensionsFromExecutableParameters(registry, method)); // Since registerBeforeEachMethodAdapters() and registerAfterEachMethodAdapters() also // invoke registerExtensionsFromExecutableParameters(), we invoke those methods before - // invoking registerExtensionsFromExecutableParameters() for @BeforeAll methods, + // invoking registerExtensionsFromExecutableParameters() for @AfterAll methods, // thereby ensuring proper registration order for extensions registered via @ExtendWith // on parameters in lifecycle methods. registerBeforeEachMethodAdapters(registry); diff --git a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExtensionUtils.java b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExtensionUtils.java index 39a17bce464d..3d866805b7ce 100644 --- a/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExtensionUtils.java +++ b/junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ExtensionUtils.java @@ -148,7 +148,8 @@ static void registerExtensionsFromConstructorParameters(ExtensionRegistrar regis /** * Register extensions using the supplied registrar from parameters in the * supplied {@link Executable} (i.e., a {@link java.lang.reflect.Constructor} - * or {@link java.lang.reflect.Method}) that are annotated with{@link ExtendWith @ExtendWith}. + * or {@link java.lang.reflect.Method}) that are meta-annotated with + * {@link ExtendWith @ExtendWith}. * * @param registrar the registrar with which to register the extensions; never {@code null} * @param executable the constructor or method whose parameters should be searched; never {@code null} diff --git a/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistrationViaParametersAndFieldsTests.java b/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistrationViaParametersAndFieldsTests.java index 0346fa8890ee..4c4509706029 100644 --- a/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistrationViaParametersAndFieldsTests.java +++ b/junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistrationViaParametersAndFieldsTests.java @@ -354,7 +354,10 @@ static void afterAll(String text, TestInfo testInfo) { } /** - * The {@link MagicParameter.Extension} is first registered for the {@code @AfterAll} method. + * The {@link MagicParameter.Extension} is first registered for the {@code @AfterAll} + * method, but that registration occurs before the test method is invoked, which + * allows the string parameters in the after-each and test methods to be resolved + * by the {@link MagicParameter.Extension} as well. */ @ExtendWith(LongParameterResolver.class) static class AfterAllParameterTestCase { @@ -365,6 +368,13 @@ void test(TestInfo testInfo, String text) { assertThat(text).isEqualTo("test-1-enigma"); } + @AfterEach + void afterEach(Long number, TestInfo testInfo, String text) { + assertThat(number).isEqualTo(42L); + assertThat(testInfo).isNotNull(); + assertThat(text).isEqualTo("afterEach-2-enigma"); + } + @AfterAll static void afterAll(Long number, TestInfo testInfo, @MagicParameter("method") String text) { assertThat(number).isEqualTo(42L); @@ -407,13 +417,18 @@ void afterEach(Long number, TestInfo testInfo, @MagicParameter("method") String } /** - * The {@link MagicParameter.Extension} is first registered for the {@code @AfterEach} method. + * The {@link MagicParameter.Extension} is first registered for the {@code @AfterEach} + * method, but that registration occurs before the test method is invoked, which + * allows the test method's parameter to be resolved by the {@link MagicParameter.Extension} + * as well. */ @ExtendWith(LongParameterResolver.class) static class AfterEachParameterTestCase { @Test - void test() { + void test(TestInfo testInfo, String text) { + assertThat(testInfo).isNotNull(); + assertThat(text).isEqualTo("test-1-enigma"); } @AfterEach @@ -438,10 +453,6 @@ void test(TestInfo testInfo, @MagicParameter("method") String text) { assertThat(text).isEqualTo("test-1-method"); } - /** - * Redeclaring {@code @MagicParameter} should not result in a - * {@link ParameterResolutionException}. - */ @AfterEach void afterEach(Long number, TestInfo testInfo, String text) { assertThat(number).isEqualTo(42L); @@ -466,10 +477,6 @@ Stream testFactory(TestInfo testInfo, @MagicParameter("method") Str return IntStream.of(2, 4).mapToObj(num -> dynamicTest("" + num, () -> assertTrue(num % 2 == 0))); } - /** - * Redeclaring {@code @MagicParameter} should not result in a - * {@link ParameterResolutionException}. - */ @AfterEach void afterEach(Long number, TestInfo testInfo, String text) { assertThat(number).isEqualTo(42L); @@ -493,10 +500,6 @@ void testTemplate(TestInfo testInfo, @MagicParameter("method") String text) { assertThat(text).isEqualTo("testTemplate-1-method"); } - /** - * Redeclaring {@code @MagicParameter} should not result in a - * {@link ParameterResolutionException}. - */ @AfterEach void afterEach(Long number, TestInfo testInfo, String text) { assertThat(number).isEqualTo(42L);