Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 45f1b38

Browse files
sbrannenrunningcode
authored andcommittedFeb 15, 2023
Test implicit vs. explicit extension registration order for fields
This commit introduces extensions registered explicitly via @RegisterExtension to verify the respective ordering with extensions registered implicitly via @ExtendWith on fields. Issue: junit-team#864
1 parent 27709f7 commit 45f1b38

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed
 

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

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import org.junit.jupiter.api.BeforeEach;
4141
import org.junit.jupiter.api.DynamicTest;
4242
import org.junit.jupiter.api.Nested;
43+
import org.junit.jupiter.api.Order;
4344
import org.junit.jupiter.api.Test;
4445
import org.junit.jupiter.api.TestFactory;
4546
import org.junit.jupiter.api.TestInfo;
@@ -49,10 +50,12 @@
4950
import org.junit.jupiter.api.extension.BeforeAllCallback;
5051
import org.junit.jupiter.api.extension.BeforeEachCallback;
5152
import org.junit.jupiter.api.extension.ExtendWith;
53+
import org.junit.jupiter.api.extension.Extension;
5254
import org.junit.jupiter.api.extension.ExtensionContext;
5355
import org.junit.jupiter.api.extension.ParameterContext;
5456
import org.junit.jupiter.api.extension.ParameterResolutionException;
5557
import org.junit.jupiter.api.extension.ParameterResolver;
58+
import org.junit.jupiter.api.extension.RegisterExtension;
5659
import org.junit.jupiter.api.extension.TestTemplateInvocationContext;
5760
import org.junit.jupiter.api.extension.TestTemplateInvocationContextProvider;
5861
import org.junit.jupiter.api.fixtures.TrackLogRecords;
@@ -135,22 +138,52 @@ void fieldsWithTestInstancePerClass() {
135138
void registrationOrder(LogRecordListener listener) {
136139
assertOneTestSucceeded(AllInOneWithTestInstancePerMethodTestCase.class);
137140
assertThat(getRegisteredLocalExtensions(listener))//
138-
.containsExactly("StaticField", "ConstructorParameter", "BeforeAllParameter", "BeforeEachParameter",
139-
"AfterEachParameter", "AfterAllParameter", "TestParameter", "InstanceField");
141+
.containsExactly(//
142+
"StaticField", // @ExtendWith on static field
143+
"ClassLevelExtension1", // @RegisterExtension on static field
144+
"ClassLevelExtension2", // @RegisterExtension on static field
145+
"ConstructorParameter", // @ExtendWith on parameter in constructor
146+
"BeforeAllParameter", // @ExtendWith on parameter in static @BeforeAll method
147+
"BeforeEachParameter", // @ExtendWith on parameter in @BeforeEach method
148+
"AfterEachParameter", // @ExtendWith on parameter in @AfterEach method
149+
"AfterAllParameter", // @ExtendWith on parameter in static @AfterAll method
150+
"TestParameter", // @ExtendWith on parameter in @Test method
151+
"InstanceField", // @ExtendWith on instance field
152+
"InstanceLevelExtension1", // @RegisterExtension on instance field
153+
"InstanceLevelExtension2"// @RegisterExtension on instance field
154+
);
140155

141156
listener.clear();
142157
assertOneTestSucceeded(AllInOneWithTestInstancePerClassTestCase.class);
143158
assertThat(getRegisteredLocalExtensions(listener))//
144-
.containsExactly("StaticField", "ConstructorParameter", "BeforeAllParameter", "BeforeEachParameter",
145-
"AfterEachParameter", "AfterAllParameter", "InstanceField", "TestParameter");
159+
.containsExactly(//
160+
"StaticField", // @ExtendWith on static field
161+
"ClassLevelExtension1", // @RegisterExtension on static field
162+
"ClassLevelExtension2", // @RegisterExtension on static field
163+
"ConstructorParameter", // @ExtendWith on parameter in constructor
164+
"BeforeAllParameter", // @ExtendWith on parameter in static @BeforeAll method
165+
"BeforeEachParameter", // @ExtendWith on parameter in @BeforeEach method
166+
"AfterEachParameter", // @ExtendWith on parameter in @AfterEach method
167+
"AfterAllParameter", // @ExtendWith on parameter in static @AfterAll method
168+
"InstanceField", // @ExtendWith on instance field
169+
"InstanceLevelExtension1", // @RegisterExtension on instance field
170+
"InstanceLevelExtension2", // @RegisterExtension on instance field
171+
"TestParameter" // @ExtendWith on parameter in @Test method
172+
);
146173
}
147174

148175
private List<String> getRegisteredLocalExtensions(LogRecordListener listener) {
149176
// @formatter:off
150177
return listener.stream(MutableExtensionRegistry.class, Level.FINER)
151178
.map(LogRecord::getMessage)
152179
.filter(message -> message.contains("local extension"))
153-
.map(message -> message.substring(message.lastIndexOf('.') + 1, message.indexOf("$")))
180+
.map(message -> {
181+
message = message.replaceAll("from source .+", "");
182+
int indexOfDollarSign = message.indexOf("$");
183+
int indexOfAtSign = message.indexOf("@");
184+
int endIndex = (indexOfDollarSign > 1 ? indexOfDollarSign : indexOfAtSign);
185+
return message.substring(message.lastIndexOf('.') + 1, endIndex);
186+
})
154187
.collect(toList());
155188
// @formatter:on
156189
}
@@ -568,6 +601,22 @@ static class AllInOneWithTestInstancePerMethodTestCase {
568601
@InstanceField
569602
String instanceField;
570603

604+
@RegisterExtension
605+
@Order(1)
606+
static Extension classLevelExtension1 = new ClassLevelExtension1();
607+
608+
@RegisterExtension
609+
@Order(2)
610+
static Extension classLevelExtension2 = new ClassLevelExtension2();
611+
612+
@RegisterExtension
613+
@Order(1)
614+
Extension instanceLevelExtension1 = new InstanceLevelExtension1();
615+
616+
@RegisterExtension
617+
@Order(2)
618+
Extension instanceLevelExtension2 = new InstanceLevelExtension2();
619+
571620
AllInOneWithTestInstancePerMethodTestCase(@ConstructorParameter String text) {
572621
assertThat(text).isEqualTo("enigma");
573622
}
@@ -772,3 +821,15 @@ class Extension extends BaseFieldExtension<InstanceField> {
772821
class Extension extends BaseFieldExtension<StaticField> {
773822
}
774823
}
824+
825+
class ClassLevelExtension1 implements Extension {
826+
}
827+
828+
class ClassLevelExtension2 implements Extension {
829+
}
830+
831+
class InstanceLevelExtension1 implements Extension {
832+
}
833+
834+
class InstanceLevelExtension2 implements Extension {
835+
}

0 commit comments

Comments
 (0)
Please sign in to comment.