Skip to content

Commit a844744

Browse files
committed
Improve programmatic extension registration tests
Prerequisite for #3553
1 parent a6048cf commit a844744

File tree

2 files changed

+127
-60
lines changed

2 files changed

+127
-60
lines changed

junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/OrderedProgrammaticExtensionRegistrationTests.java

Lines changed: 87 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package org.junit.jupiter.engine.extension;
1212

13+
import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;
1314
import static org.assertj.core.api.Assertions.assertThat;
1415
import static org.junit.jupiter.api.Order.DEFAULT;
1516
import static org.junit.jupiter.api.TestInstance.Lifecycle.PER_CLASS;
@@ -41,7 +42,7 @@
4142
*/
4243
class OrderedProgrammaticExtensionRegistrationTests extends AbstractJupiterTestEngineTests {
4344

44-
private static final List<Integer> callSequence = new ArrayList<>();
45+
private static final List<String> callSequence = new ArrayList<>();
4546

4647
/**
4748
* This method basically verifies the implementation of
@@ -69,17 +70,35 @@ void clearCallSequence() {
6970

7071
@Test
7172
void instanceLevelWithDefaultOrder() {
72-
assertOutcome(DefaultOrderInstanceLevelExtensionRegistrationTestCase.class, 1, 2, 3);
73+
Class<?> testClass = DefaultOrderInstanceLevelExtensionRegistrationTestCase.class;
74+
String testClassName = testClass.getSimpleName();
75+
assertOutcome(testClass, //
76+
testClassName + " :: extension1 :: before test", //
77+
testClassName + " :: extension2 :: before test", //
78+
testClassName + " :: extension3 :: before test" //
79+
);
7380
}
7481

7582
@Test
7683
void instanceLevelWithExplicitOrder() {
77-
assertOutcome(ExplicitOrderInstanceLevelExtensionRegistrationTestCase.class, 3, 2, 1);
84+
Class<?> testClass = ExplicitOrderInstanceLevelExtensionRegistrationTestCase.class;
85+
String testClassName = testClass.getSimpleName();
86+
assertOutcome(testClass, //
87+
testClassName + " :: extension3 :: before test", //
88+
testClassName + " :: extension2 :: before test", //
89+
testClassName + " :: extension1 :: before test" //
90+
);
7891
}
7992

8093
@Test
8194
void instanceLevelWithDefaultOrderAndExplicitOrder() {
82-
assertOutcome(DefaultOrderAndExplicitOrderInstanceLevelExtensionRegistrationTestCase.class, 3, 1, 2);
95+
Class<?> testClass = DefaultOrderAndExplicitOrderInstanceLevelExtensionRegistrationTestCase.class;
96+
String testClassName = testClass.getSimpleName();
97+
assertOutcome(testClass, //
98+
testClassName + " :: extension3 :: before test", //
99+
testClassName + " :: extension1 :: before test", //
100+
testClassName + " :: extension2 :: before test" //
101+
);
83102
}
84103

85104
/**
@@ -91,44 +110,88 @@ void instanceLevelWithDefaultOrderAndExplicitOrder() {
91110
*/
92111
@Test
93112
void instanceLevelWithDefaultOrderPlusOneAndDefaultOrder() {
94-
assertOutcome(DefaultOrderPlusOneAndDefaultOrderInstanceLevelExtensionRegistrationTestCase.class, 1, 3, 2);
113+
Class<?> testClass = DefaultOrderPlusOneAndDefaultOrderInstanceLevelExtensionRegistrationTestCase.class;
114+
String testClassName = testClass.getSimpleName();
115+
assertOutcome(testClass, //
116+
testClassName + " :: extension1 :: after test", //
117+
testClassName + " :: extension3 :: after test", //
118+
testClassName + " :: extension2 :: after test" //
119+
);
95120
}
96121

97122
@Test
98123
void instanceLevelWithDefaultOrderAndExplicitOrderWithTestInstancePerClassLifecycle() {
99-
assertOutcome(
100-
DefaultOrderAndExplicitOrderInstanceLevelExtensionRegistrationWithTestInstancePerClassLifecycleTestCase.class,
101-
3, 1, 2);
124+
Class<?> testClass = DefaultOrderAndExplicitOrderInstanceLevelExtensionRegistrationWithTestInstancePerClassLifecycleTestCase.class;
125+
String testClassName = testClass.getSimpleName();
126+
assertOutcome(testClass, //
127+
testClassName + " :: extension3 :: before test", //
128+
testClassName + " :: extension1 :: before test", //
129+
testClassName + " :: extension2 :: before test" //
130+
);
102131
}
103132

104133
@Test
105134
void classLevelWithDefaultOrderAndExplicitOrder() {
106-
assertOutcome(DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class, 3, 1, 2);
135+
Class<?> testClass = DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
136+
String testClassName = testClass.getSimpleName();
137+
assertOutcome(testClass, //
138+
testClassName + " :: extension3 :: before test", //
139+
testClassName + " :: extension1 :: before test", //
140+
testClassName + " :: extension2 :: before test" //
141+
);
107142
}
108143

109144
@Test
110145
void classLevelWithDefaultOrderAndExplicitOrderInheritedFromSuperclass() {
111-
assertOutcome(InheritedDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class, 3, 1, 2);
146+
Class<?> testClass = InheritedDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
147+
Class<?> parent = DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
148+
String parentName = parent.getSimpleName();
149+
assertOutcome(testClass, //
150+
parentName + " :: extension3 :: before test", //
151+
parentName + " :: extension1 :: before test", //
152+
parentName + " :: extension2 :: before test" //
153+
);
112154
}
113155

114156
@Test
115157
void classLevelWithDefaultOrderShadowingOrderFromSuperclass() {
116-
assertOutcome(DefaultOrderShadowingDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class, 1,
117-
2, 3);
158+
Class<?> testClass = DefaultOrderShadowingDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
159+
String testClassName = testClass.getSimpleName();
160+
Class<?> parent = DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
161+
String parentName = parent.getSimpleName();
162+
assertOutcome(testClass, //
163+
parentName + " :: extension1 :: before test", //
164+
parentName + " :: extension2 :: before test", //
165+
testClassName + " :: extension3 :: before test" //
166+
);
118167
}
119168

120169
@Test
121170
void classLevelWithExplicitOrderShadowingOrderFromSuperclass() {
122-
assertOutcome(ExplicitOrderShadowingDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class,
123-
3, 2, 1);
171+
Class<?> testClass = ExplicitOrderShadowingDefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
172+
String testClassName = testClass.getSimpleName();
173+
Class<?> parent = DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationTestCase.class;
174+
String parentName = parent.getSimpleName();
175+
assertOutcome(testClass, //
176+
parentName + " :: extension3 :: before test", //
177+
testClassName + " :: extension2 :: before test", //
178+
parentName + " :: extension1 :: before test" //
179+
);
124180
}
125181

126182
@Test
127183
void classLevelWithDefaultOrderAndExplicitOrderFromInterface() {
128-
assertOutcome(DefaultOrderAndExplicitOrderExtensionRegistrationFromInterfaceTestCase.class, 3, 1, 2);
184+
Class<?> testClass = DefaultOrderAndExplicitOrderExtensionRegistrationFromInterfaceTestCase.class;
185+
Class<?> testInterface = DefaultOrderAndExplicitOrderClassLevelExtensionRegistrationInterface.class;
186+
String interfaceName = testInterface.getSimpleName();
187+
assertOutcome(testClass, //
188+
interfaceName + " :: extension3 :: before test", //
189+
interfaceName + " :: extension1 :: before test", //
190+
interfaceName + " :: extension2 :: before test" //
191+
);
129192
}
130193

131-
private void assertOutcome(Class<?> testClass, Integer... values) {
194+
private void assertOutcome(Class<?> testClass, String... values) {
132195
executeTestsForClass(testClass).testEvents().assertStatistics(stats -> stats.succeeded(1));
133196
assertThat(callSequence).containsExactly(values);
134197
}
@@ -280,30 +343,32 @@ static class DefaultOrderAndExplicitOrderExtensionRegistrationFromInterfaceTestC
280343

281344
private static class BeforeEachExtension implements BeforeEachCallback {
282345

283-
private final int id;
346+
private final String prefix;
284347

285348
BeforeEachExtension(int id) {
286-
this.id = id;
349+
Class<?> callerClass = StackWalker.getInstance(RETAIN_CLASS_REFERENCE).getCallerClass();
350+
this.prefix = callerClass.getSimpleName() + " :: extension" + id + " :: before ";
287351
}
288352

289353
@Override
290354
public void beforeEach(ExtensionContext context) {
291-
callSequence.add(this.id);
355+
callSequence.add(this.prefix + context.getRequiredTestMethod().getName());
292356
}
293357

294358
}
295359

296360
private static class AfterEachExtension implements AfterEachCallback {
297361

298-
private final int id;
362+
private final String prefix;
299363

300364
AfterEachExtension(int id) {
301-
this.id = id;
365+
Class<?> callerClass = StackWalker.getInstance(RETAIN_CLASS_REFERENCE).getCallerClass();
366+
this.prefix = callerClass.getSimpleName() + " :: extension" + id + " :: after ";
302367
}
303368

304369
@Override
305370
public void afterEach(ExtensionContext context) {
306-
callSequence.add(this.id);
371+
callSequence.add(this.prefix + context.getRequiredTestMethod().getName());
307372
}
308373

309374
}

junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/extension/ProgrammaticExtensionRegistrationTests.java

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
package org.junit.jupiter.engine.extension;
1212

13+
import static java.lang.StackWalker.Option.RETAIN_CLASS_REFERENCE;
1314
import static org.assertj.core.api.Assertions.allOf;
1415
import static org.assertj.core.api.Assertions.assertThat;
1516
import static org.junit.jupiter.api.Assertions.assertEquals;
@@ -61,6 +62,11 @@ class ProgrammaticExtensionRegistrationTests extends AbstractJupiterTestEngineTe
6162

6263
private static final List<String> callSequence = new ArrayList<>();
6364

65+
@BeforeEach
66+
void clearCallSequence() {
67+
callSequence.clear();
68+
}
69+
6470
@Test
6571
void instanceLevel() {
6672
assertOneTestSucceeded(InstanceLevelExtensionRegistrationTestCase.class);
@@ -93,45 +99,43 @@ void classLevelFromInterface() {
9399

94100
@Test
95101
void instanceLevelWithInheritedAndHiddenExtensions() {
96-
callSequence.clear();
97102
Class<?> testClass = InstanceLevelExtensionRegistrationParentTestCase.class;
98103
String parent = testClass.getSimpleName();
99104
assertOneTestSucceeded(testClass);
100105
assertThat(callSequence).containsExactly( //
101-
parent + " :: extension1: before test", //
102-
parent + " :: extension2: before test" //
106+
parent + " :: extension1 :: before test", //
107+
parent + " :: extension2 :: before test" //
103108
);
104109

105110
callSequence.clear();
106111
testClass = InstanceLevelExtensionRegistrationChildTestCase.class;
107112
String child = testClass.getSimpleName();
108113
assertOneTestSucceeded(testClass);
109114
assertThat(callSequence).containsExactly( //
110-
parent + " :: extension1: before test", //
111-
child + " :: extension2: before test", //
112-
child + " :: extension3: before test" //
115+
parent + " :: extension1 :: before test", //
116+
child + " :: extension2 :: before test", //
117+
child + " :: extension3 :: before test" //
113118
);
114119
}
115120

116121
@Test
117122
void classLevelWithInheritedAndHiddenExtensions() {
118-
callSequence.clear();
119123
Class<?> testClass = ClassLevelExtensionRegistrationParentTestCase.class;
120124
String parent = testClass.getSimpleName();
121125
assertOneTestSucceeded(testClass);
122126
assertThat(callSequence).containsExactly( //
123-
parent + " :: extension1: before test", //
124-
parent + " :: extension2: before test" //
127+
parent + " :: extension1 :: before test", //
128+
parent + " :: extension2 :: before test" //
125129
);
126130

127131
callSequence.clear();
128132
testClass = ClassLevelExtensionRegistrationChildTestCase.class;
129133
String child = testClass.getSimpleName();
130134
assertOneTestSucceeded(testClass);
131135
assertThat(callSequence).containsExactly( //
132-
parent + " :: extension1: before test", //
133-
child + " :: extension2: before test", //
134-
child + " :: extension3: before test" //
136+
parent + " :: extension1 :: before test", //
137+
child + " :: extension2 :: before test", //
138+
child + " :: extension3 :: before test" //
135139
);
136140
}
137141

@@ -140,7 +144,6 @@ void classLevelWithInheritedAndHiddenExtensions() {
140144
*/
141145
@Test
142146
void instanceLevelWithFieldThatDoesNotImplementAnExtensionApi() {
143-
callSequence.clear();
144147
assertOneTestSucceeded(InstanceLevelCustomExtensionApiTestCase.class);
145148
assertThat(callSequence).containsExactly( //
146149
CustomExtensionImpl.class.getSimpleName() + " :: before test", //
@@ -153,7 +156,6 @@ void instanceLevelWithFieldThatDoesNotImplementAnExtensionApi() {
153156
*/
154157
@Test
155158
void classLevelWithFieldThatDoesNotImplementAnExtensionApi() {
156-
callSequence.clear();
157159
assertOneTestSucceeded(ClassLevelCustomExtensionApiTestCase.class);
158160
assertThat(callSequence).containsExactly( //
159161
CustomExtensionImpl.class.getSimpleName() + " :: before test", //
@@ -474,14 +476,10 @@ public Object resolveParameter(ParameterContext parameterContext, ExtensionConte
474476
static class ClassLevelExtensionRegistrationParentTestCase {
475477

476478
@RegisterExtension
477-
static BeforeEachCallback extension1 = context -> callSequence.add(
478-
ClassLevelExtensionRegistrationParentTestCase.class.getSimpleName() + " :: extension1: before "
479-
+ context.getRequiredTestMethod().getName());
479+
static Extension extension1 = new BeforeEachExtension(1);
480480

481481
@RegisterExtension
482-
static BeforeEachCallback extension2 = context -> callSequence.add(
483-
ClassLevelExtensionRegistrationParentTestCase.class.getSimpleName() + " :: extension2: before "
484-
+ context.getRequiredTestMethod().getName());
482+
static Extension extension2 = new BeforeEachExtension(2);
485483

486484
@Test
487485
void test() {
@@ -493,28 +491,20 @@ static class ClassLevelExtensionRegistrationChildTestCase extends ClassLevelExte
493491

494492
// "Hides" ClassLevelExtensionRegistrationParentTestCase.extension2
495493
@RegisterExtension
496-
static BeforeEachCallback extension2 = context -> callSequence.add(
497-
ClassLevelExtensionRegistrationChildTestCase.class.getSimpleName() + " :: extension2: before "
498-
+ context.getRequiredTestMethod().getName());
494+
static Extension extension2 = new BeforeEachExtension(2);
499495

500496
@RegisterExtension
501-
static BeforeEachCallback extension3 = context -> callSequence.add(
502-
ClassLevelExtensionRegistrationChildTestCase.class.getSimpleName() + " :: extension3: before "
503-
+ context.getRequiredTestMethod().getName());
497+
static Extension extension3 = new BeforeEachExtension(3);
504498

505499
}
506500

507501
static class InstanceLevelExtensionRegistrationParentTestCase {
508502

509503
@RegisterExtension
510-
BeforeEachCallback extension1 = context -> callSequence.add(
511-
InstanceLevelExtensionRegistrationParentTestCase.class.getSimpleName() + " :: extension1: before "
512-
+ context.getRequiredTestMethod().getName());
504+
Extension extension1 = new BeforeEachExtension(1);
513505

514506
@RegisterExtension
515-
BeforeEachCallback extension2 = context -> callSequence.add(
516-
InstanceLevelExtensionRegistrationParentTestCase.class.getSimpleName() + " :: extension2: before "
517-
+ context.getRequiredTestMethod().getName());
507+
Extension extension2 = new BeforeEachExtension(2);
518508

519509
@Test
520510
void test() {
@@ -527,14 +517,26 @@ static class InstanceLevelExtensionRegistrationChildTestCase
527517

528518
// "Hides" InstanceLevelExtensionRegistrationParentTestCase.extension2
529519
@RegisterExtension
530-
BeforeEachCallback extension2 = context -> callSequence.add(
531-
InstanceLevelExtensionRegistrationChildTestCase.class.getSimpleName() + " :: extension2: before "
532-
+ context.getRequiredTestMethod().getName());
520+
Extension extension2 = new BeforeEachExtension(2);
533521

534522
@RegisterExtension
535-
BeforeEachCallback extension3 = context -> callSequence.add(
536-
InstanceLevelExtensionRegistrationChildTestCase.class.getSimpleName() + " :: extension3: before "
537-
+ context.getRequiredTestMethod().getName());
523+
Extension extension3 = new BeforeEachExtension(3);
524+
525+
}
526+
527+
private static class BeforeEachExtension implements BeforeEachCallback {
528+
529+
private final String prefix;
530+
531+
BeforeEachExtension(int id) {
532+
Class<?> callerClass = StackWalker.getInstance(RETAIN_CLASS_REFERENCE).getCallerClass();
533+
this.prefix = callerClass.getSimpleName() + " :: extension" + id + " :: before ";
534+
}
535+
536+
@Override
537+
public void beforeEach(ExtensionContext context) {
538+
callSequence.add(this.prefix + context.getRequiredTestMethod().getName());
539+
}
538540

539541
}
540542

0 commit comments

Comments
 (0)