|
16 | 16 | import static org.junit.jupiter.api.DynamicTest.dynamicTest;
|
17 | 17 | import static org.junit.platform.commons.util.AnnotationUtils.findAnnotatedFields;
|
18 | 18 | import static org.junit.platform.commons.util.ReflectionUtils.makeAccessible;
|
| 19 | +import static org.junit.platform.testkit.engine.EventConditions.finishedWithFailure; |
| 20 | +import static org.junit.platform.testkit.engine.TestExecutionResultConditions.instanceOf; |
| 21 | +import static org.junit.platform.testkit.engine.TestExecutionResultConditions.message; |
19 | 22 |
|
20 | 23 | import java.lang.annotation.Annotation;
|
21 | 24 | import java.lang.annotation.ElementType;
|
|
61 | 64 | import org.junit.jupiter.api.fixtures.TrackLogRecords;
|
62 | 65 | import org.junit.jupiter.engine.AbstractJupiterTestEngineTests;
|
63 | 66 | import org.junit.jupiter.engine.execution.injection.sample.LongParameterResolver;
|
| 67 | +import org.junit.platform.commons.PreconditionViolationException; |
64 | 68 | import org.junit.platform.commons.logging.LogRecordListener;
|
65 | 69 | import org.junit.platform.commons.util.ExceptionUtils;
|
66 | 70 | import org.junit.platform.commons.util.ReflectionUtils;
|
67 | 71 |
|
68 | 72 | /**
|
69 | 73 | * Integration tests that verify support for extension registration via
|
70 |
| - * {@link ExtendWith @ExtendWith} on annotations on parameters and fields. |
| 74 | + * {@link ExtendWith @ExtendWith} on parameters and fields. |
71 | 75 | *
|
72 | 76 | * @since 5.8
|
73 | 77 | */
|
@@ -133,6 +137,26 @@ void fieldsWithTestInstancePerClass() {
|
133 | 137 | assertOneTestSucceeded(TestInstancePerClassFieldTestCase.class);
|
134 | 138 | }
|
135 | 139 |
|
| 140 | + @Test |
| 141 | + @TrackLogRecords |
| 142 | + void multipleRegistrationsViaField(LogRecordListener listener) { |
| 143 | + assertOneTestSucceeded(MultipleRegistrationsViaFieldTestCase.class); |
| 144 | + assertThat(getRegisteredLocalExtensions(listener)).containsExactly("LongParameterResolver", "DummyExtension"); |
| 145 | + } |
| 146 | + |
| 147 | + @Test |
| 148 | + void duplicateRegistrationViaField() { |
| 149 | + Class<?> testClass = DuplicateRegistrationViaFieldTestCase.class; |
| 150 | + String expectedMessage = "Failed to register extension via field " |
| 151 | + + "[org.junit.jupiter.api.extension.Extension " |
| 152 | + + "org.junit.jupiter.engine.extension.ExtensionRegistrationViaParametersAndFieldsTests$DuplicateRegistrationViaFieldTestCase.dummy]. " |
| 153 | + + "The field registers an extension of type [org.junit.jupiter.engine.extension.DummyExtension] " |
| 154 | + + "via @RegisterExtension and @ExtendWith, but only one registration of a given extension type is permitted."; |
| 155 | + |
| 156 | + executeTestsForClass(testClass).testEvents().assertThatEvents().haveExactly(1, |
| 157 | + finishedWithFailure(instanceOf(PreconditionViolationException.class), message(expectedMessage))); |
| 158 | + } |
| 159 | + |
136 | 160 | @Test
|
137 | 161 | @TrackLogRecords
|
138 | 162 | void registrationOrder(LogRecordListener listener) {
|
@@ -531,6 +555,28 @@ private static TestTemplateInvocationContext emptyTestTemplateInvocationContext(
|
531 | 555 | }
|
532 | 556 | }
|
533 | 557 |
|
| 558 | + static class MultipleRegistrationsViaFieldTestCase { |
| 559 | + |
| 560 | + @ExtendWith(LongParameterResolver.class) |
| 561 | + @RegisterExtension |
| 562 | + Extension dummy = new DummyExtension(); |
| 563 | + |
| 564 | + @Test |
| 565 | + void test() { |
| 566 | + } |
| 567 | + } |
| 568 | + |
| 569 | + static class DuplicateRegistrationViaFieldTestCase { |
| 570 | + |
| 571 | + @ExtendWith(DummyExtension.class) |
| 572 | + @RegisterExtension |
| 573 | + Extension dummy = new DummyExtension(); |
| 574 | + |
| 575 | + @Test |
| 576 | + void test() { |
| 577 | + } |
| 578 | + } |
| 579 | + |
534 | 580 | /**
|
535 | 581 | * The {@link MagicField.Extension} is registered via a static field.
|
536 | 582 | */
|
@@ -791,6 +837,9 @@ class Extension extends BaseParameterExtension<TestParameter> {
|
791 | 837 | }
|
792 | 838 | }
|
793 | 839 |
|
| 840 | +class DummyExtension implements Extension { |
| 841 | +} |
| 842 | + |
794 | 843 | class BaseFieldExtension<T extends Annotation> implements BeforeAllCallback, BeforeEachCallback {
|
795 | 844 |
|
796 | 845 | private final Class<T> annotationType;
|
|
0 commit comments