Skip to content

Commit fb1254c

Browse files
committed
Allow repeating ExtendWith annotation on fields and parameters
Fixes #4059.
1 parent a3192bd commit fb1254c

File tree

4 files changed

+39
-10
lines changed

4 files changed

+39
-10
lines changed

documentation/src/docs/asciidoc/release-notes/release-notes-5.11.3.adoc

+2-1
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,11 @@ on GitHub.
3838

3939
* Extensions can once again be registered via multiple `@ExtendWith` meta-annotations on
4040
the same composed annotation on a field within a test class.
41+
* `@ExtendWith` annotations can now also be repeated when used directly on fields and
42+
parameters.
4143
* All `@...Source` annotations of parameterized tests can now also be repeated when used
4244
as meta annotations.
4345

44-
4546
[[release-notes-5.11.3-junit-jupiter-deprecations-and-breaking-changes]]
4647
==== Deprecations and Breaking Changes
4748

junit-jupiter-api/src/main/java/org/junit/jupiter/api/extension/Extensions.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* @see ExtendWith
3434
* @see java.lang.annotation.Repeatable
3535
*/
36-
@Target({ ElementType.TYPE, ElementType.METHOD })
36+
@Target({ ElementType.TYPE, ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER })
3737
@Retention(RetentionPolicy.RUNTIME)
3838
@Documented
3939
@Inherited

jupiter-tests/src/test/java/org/junit/jupiter/engine/extension/ExtensionRegistrationViaParametersAndFieldsTests.java

+36-5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ void testTemplateMethodParameter() {
132132
assertTestsSucceeded(TestTemplateMethodParameterTestCase.class, 2);
133133
}
134134

135+
@Test
136+
void multipleRegistrationsViaParameter(@TrackLogRecords LogRecordListener listener) {
137+
assertOneTestSucceeded(MultipleRegistrationsViaParameterTestCase.class);
138+
assertThat(getRegisteredLocalExtensions(listener)).containsExactly("LongParameterResolver", "DummyExtension");
139+
}
140+
135141
@Test
136142
void staticField() {
137143
assertOneTestSucceeded(StaticFieldTestCase.class);
@@ -147,9 +153,11 @@ void fieldsWithTestInstancePerClass() {
147153
assertOneTestSucceeded(TestInstancePerClassFieldTestCase.class);
148154
}
149155

150-
@Test
151-
void multipleRegistrationsViaField(@TrackLogRecords LogRecordListener listener) {
152-
assertOneTestSucceeded(MultipleRegistrationsViaFieldTestCase.class);
156+
@ParameterizedTest
157+
@ValueSource(classes = { MultipleMixedRegistrationsViaFieldTestCase.class,
158+
MultipleExtendWithRegistrationsViaFieldTestCase.class })
159+
void multipleRegistrationsViaField(Class<?> testClass, @TrackLogRecords LogRecordListener listener) {
160+
assertOneTestSucceeded(testClass);
153161
assertThat(getRegisteredLocalExtensions(listener)).containsExactly("LongParameterResolver", "DummyExtension");
154162
}
155163

@@ -567,14 +575,37 @@ private static TestTemplateInvocationContext emptyTestTemplateInvocationContext(
567575
}
568576
}
569577

570-
static class MultipleRegistrationsViaFieldTestCase {
578+
@ExtendWith(LongParameterResolver.class)
579+
static class MultipleRegistrationsViaParameterTestCase {
580+
581+
@Test
582+
void test(@ExtendWith(DummyExtension.class) @ExtendWith(LongParameterResolver.class) Long number) {
583+
assertThat(number).isEqualTo(42L);
584+
}
585+
}
586+
587+
static class MultipleMixedRegistrationsViaFieldTestCase {
571588

572589
@ExtendWith(LongParameterResolver.class)
573590
@RegisterExtension
574591
DummyExtension dummy = new DummyExtension();
575592

576593
@Test
577-
void test() {
594+
void test(Long number) {
595+
assertThat(number).isEqualTo(42L);
596+
}
597+
}
598+
599+
static class MultipleExtendWithRegistrationsViaFieldTestCase {
600+
601+
@SuppressWarnings("unused")
602+
@ExtendWith(LongParameterResolver.class)
603+
@ExtendWith(DummyExtension.class)
604+
Object field;
605+
606+
@Test
607+
void test(Long number) {
608+
assertThat(number).isEqualTo(42L);
578609
}
579610
}
580611

platform-tooling-support-tests/src/test/java/platform/tooling/support/tests/ArchUnitTests.java

-3
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage;
1818
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAnyPackage;
1919
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.simpleName;
20-
import static com.tngtech.archunit.core.domain.JavaClass.Predicates.type;
2120
import static com.tngtech.archunit.core.domain.JavaModifier.PUBLIC;
2221
import static com.tngtech.archunit.core.domain.properties.HasModifiers.Predicates.modifier;
2322
import static com.tngtech.archunit.core.domain.properties.HasName.Predicates.name;
@@ -51,7 +50,6 @@
5150
import com.tngtech.archunit.library.GeneralCodingRules;
5251

5352
import org.apiguardian.api.API;
54-
import org.junit.jupiter.api.extension.ExtendWith;
5553

5654
@AnalyzeClasses(locations = ArchUnitTests.AllJars.class)
5755
class ArchUnitTests {
@@ -72,7 +70,6 @@ class ArchUnitTests {
7270
.that(nameStartingWith("org.junit.")) //
7371
.and().areAnnotations() //
7472
.and().areAnnotatedWith(Repeatable.class) //
75-
.and(are(not(type(ExtendWith.class)))) // to be resolved in https://github.com/junit-team/junit5/issues/4059
7673
.should(haveContainerAnnotationWithSameRetentionPolicy()) //
7774
.andShould(haveContainerAnnotationWithSameTargetTypes());
7875

0 commit comments

Comments
 (0)