Skip to content

Commit bf1e000

Browse files
committed
Provide test instance to container level extensions
Issue: #419
1 parent fdadf90 commit bf1e000

File tree

4 files changed

+25
-11
lines changed

4 files changed

+25
-11
lines changed

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassBasedContainerExtensionContext.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
public final class ClassBasedContainerExtensionContext extends AbstractExtensionContext<ClassTestDescriptor>
2929
implements ContainerExtensionContext {
3030

31+
private Object testInstance;
32+
3133
public ClassBasedContainerExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
3234
ClassTestDescriptor testDescriptor) {
35+
3336
super(parent, engineExecutionListener, testDescriptor);
3437
}
3538

@@ -43,10 +46,13 @@ public Optional<Class<?>> getTestClass() {
4346
return Optional.of(getTestDescriptor().getTestClass());
4447
}
4548

49+
void setTestInstance(Object testInstance) {
50+
this.testInstance = testInstance;
51+
}
52+
4653
@Override
4754
public Optional<Object> getTestInstance() {
48-
// TODO Determine how to access the test instance
49-
return null;
55+
return Optional.ofNullable(this.testInstance);
5056
}
5157

5258
@Override

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/ClassTestDescriptor.java

+13-9
Original file line numberDiff line numberDiff line change
@@ -133,12 +133,21 @@ public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext conte
133133
registerBeforeEachMethodAdapters(registry);
134134
registerAfterEachMethodAdapters(registry);
135135

136-
ContainerExtensionContext containerExtensionContext = new ClassBasedContainerExtensionContext(
136+
ClassBasedContainerExtensionContext containerExtensionContext = new ClassBasedContainerExtensionContext(
137137
context.getExtensionContext(), context.getExecutionListener(), this);
138138

139+
// Reuse TestInstanceProvider for potential transparent instance caching.
140+
TestInstanceProvider testInstanceProvider = testInstanceProvider(context, registry, containerExtensionContext);
141+
142+
// Eagerly load test instance for BeforeAllCallbacks, if necessary,
143+
// and store the instance in the ContainerExtensionContext.
144+
Object testInstance = (this.lifecycle == Lifecycle.PER_CLASS
145+
? testInstanceProvider.getTestInstance(Optional.empty()) : null);
146+
containerExtensionContext.setTestInstance(testInstance);
147+
139148
// @formatter:off
140149
return context.extend()
141-
.withTestInstanceProvider(testInstanceProvider(context, registry, containerExtensionContext))
150+
.withTestInstanceProvider(testInstanceProvider)
142151
.withExtensionRegistry(registry)
143152
.withExtensionContext(containerExtensionContext)
144153
.withThrowableCollector(new ThrowableCollector())
@@ -214,7 +223,7 @@ private void invokeBeforeAllMethods(JupiterEngineExecutionContext context) {
214223
ExtensionRegistry registry = context.getExtensionRegistry();
215224
ContainerExtensionContext extensionContext = (ContainerExtensionContext) context.getExtensionContext();
216225
ThrowableCollector throwableCollector = context.getThrowableCollector();
217-
Object testInstance = getTestInstanceForClassLevelCallbacks(context);
226+
Object testInstance = extensionContext.getTestInstance().orElse(null);
218227

219228
for (Method method : this.beforeAllMethods) {
220229
throwableCollector.execute(
@@ -229,17 +238,12 @@ private void invokeAfterAllMethods(JupiterEngineExecutionContext context) {
229238
ExtensionRegistry registry = context.getExtensionRegistry();
230239
ContainerExtensionContext extensionContext = (ContainerExtensionContext) context.getExtensionContext();
231240
ThrowableCollector throwableCollector = context.getThrowableCollector();
232-
Object testInstance = getTestInstanceForClassLevelCallbacks(context);
241+
Object testInstance = extensionContext.getTestInstance().orElse(null);
233242

234243
this.afterAllMethods.forEach(method -> throwableCollector.execute(
235244
() -> executableInvoker.invoke(method, testInstance, extensionContext, registry)));
236245
}
237246

238-
private Object getTestInstanceForClassLevelCallbacks(JupiterEngineExecutionContext context) {
239-
return this.lifecycle == Lifecycle.PER_CLASS
240-
? context.getTestInstanceProvider().getTestInstance(Optional.empty()) : null;
241-
}
242-
243247
private void invokeAfterAllCallbacks(JupiterEngineExecutionContext context) {
244248
ExtensionRegistry registry = context.getExtensionRegistry();
245249
ContainerExtensionContext extensionContext = (ContainerExtensionContext) context.getExtensionContext();

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/MethodBasedTestExtensionContext.java

+2
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@ public final class MethodBasedTestExtensionContext extends AbstractExtensionCont
3535

3636
public MethodBasedTestExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
3737
MethodTestDescriptor testDescriptor, Object testInstance, ThrowableCollector throwableCollector) {
38+
3839
super(parent, engineExecutionListener, testDescriptor);
40+
3941
this.testInstance = testInstance;
4042
this.throwableCollector = throwableCollector;
4143
}

junit-jupiter-engine/src/test/java/org/junit/jupiter/engine/TestInstanceLifecycleTests.java

+2
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@ private void performAssertions(Class<?> testClass, int containers, int tests, in
124124

125125
ExecutionEventRecorder eventRecorder = executeTestsForClass(testClass);
126126

127+
// eventRecorder.eventStream().forEach(System.out::println);
128+
127129
// @formatter:off
128130
assertAll(
129131
() -> assertEquals(containers, eventRecorder.getContainerStartedCount(), "# containers started"),

0 commit comments

Comments
 (0)