Skip to content

Commit fa7f256

Browse files
committed
Revert "Refine TestInstancePostProcessor API regarding access to test instance"
This reverts commit 1d30b76, reversing changes made to 3640af5.
1 parent a97e4d3 commit fa7f256

File tree

22 files changed

+145
-214
lines changed

22 files changed

+145
-214
lines changed

documentation/src/docs/asciidoc/release-notes-5.0.0-M5.adoc

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,6 @@ is placed on the Java 9 module path.
128128
* `TestExecutionCondition` and `ContainerExecutionCondition` have been replaced by a
129129
single, general purpose extension API for conditional test execution:
130130
`ExecutionCondition`.
131-
* The `postProcessTestInstance()` method in the `TestInstancePostProcessor` API is no
132-
longer supplied a direct reference to the test instance. However, the test instance
133-
can now be retrieved from the supplied `ExtensionContext` via its
134-
`Optional<Object> getTestInstance()` method.
135131

136132
[[release-notes-5.0.0-m5-migration-extension-api]]
137133
.Extension API Migration

documentation/src/test/java/example/TestInfoDemo.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,7 @@
2424
class TestInfoDemo {
2525

2626
TestInfoDemo(TestInfo testInfo) {
27-
String displayName = testInfo.getDisplayName();
28-
assertTrue(displayName.equals("TEST 1") || displayName.equals("test2()"));
27+
assertEquals("TestInfo Demo", testInfo.getDisplayName());
2928
}
3029

3130
@BeforeEach

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

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,16 @@
2525
* <p>Implementations must provide a no-args constructor.
2626
*
2727
* @since 5.0
28-
* @see #postProcessTestInstance(ExtensionContext)
2928
*/
3029
@API(Experimental)
3130
public interface TestInstancePostProcessor extends Extension {
3231

3332
/**
34-
* Callback for post-processing the test instance in the supplied
35-
* {@link ExtensionContext}.
33+
* Callback for post-processing the supplied test instance.
3634
*
35+
* @param testInstance the instance to post-process; never {@code null}
3736
* @param context the current extension context; never {@code null}
38-
* @see ExtensionContext#getTestInstance()
3937
*/
40-
void postProcessTestInstance(ExtensionContext context) throws Exception;
38+
void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception;
4139

4240
}

junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/execution/AbstractExtensionContext.java renamed to junit-jupiter-engine/src/main/java/org/junit/jupiter/engine/descriptor/AbstractExtensionContext.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,18 @@
88
* http://www.eclipse.org/legal/epl-v10.html
99
*/
1010

11-
package org.junit.jupiter.engine.execution;
11+
package org.junit.jupiter.engine.descriptor;
1212

1313
import static java.util.stream.Collectors.toCollection;
14-
import static org.junit.platform.commons.meta.API.Usage.Internal;
1514

1615
import java.util.LinkedHashSet;
1716
import java.util.Map;
1817
import java.util.Optional;
1918
import java.util.Set;
2019

2120
import org.junit.jupiter.api.extension.ExtensionContext;
22-
import org.junit.platform.commons.meta.API;
21+
import org.junit.jupiter.engine.execution.ExtensionValuesStore;
22+
import org.junit.jupiter.engine.execution.NamespaceAwareStore;
2323
import org.junit.platform.commons.util.Preconditions;
2424
import org.junit.platform.engine.EngineExecutionListener;
2525
import org.junit.platform.engine.TestDescriptor;
@@ -29,28 +29,25 @@
2929
/**
3030
* @since 5.0
3131
*/
32-
@API(Internal)
33-
public abstract class AbstractExtensionContext<T extends TestDescriptor> implements ExtensionContext {
32+
abstract class AbstractExtensionContext<T extends TestDescriptor> implements ExtensionContext {
3433

3534
private final ExtensionContext parent;
3635
private final EngineExecutionListener engineExecutionListener;
3736
private final T testDescriptor;
3837
private final ExtensionValuesStore valuesStore;
3938

40-
private Object testInstance;
41-
42-
protected AbstractExtensionContext(AbstractExtensionContext<?> parent,
43-
EngineExecutionListener engineExecutionListener, T testDescriptor) {
39+
AbstractExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
40+
T testDescriptor) {
4441
this.parent = parent;
4542
this.engineExecutionListener = engineExecutionListener;
4643
this.testDescriptor = testDescriptor;
4744
this.valuesStore = createStore(parent);
4845
}
4946

50-
private ExtensionValuesStore createStore(AbstractExtensionContext<?> parent) {
47+
private ExtensionValuesStore createStore(ExtensionContext parent) {
5148
ExtensionValuesStore parentStore = null;
5249
if (parent != null) {
53-
parentStore = parent.valuesStore;
50+
parentStore = ((AbstractExtensionContext<?>) parent).valuesStore;
5451
}
5552
return new ExtensionValuesStore(parentStore);
5653
}
@@ -65,15 +62,6 @@ public String getDisplayName() {
6562
return getTestDescriptor().getDisplayName();
6663
}
6764

68-
public void setTestInstance(Object testInstance) {
69-
this.testInstance = testInstance;
70-
}
71-
72-
@Override
73-
public Optional<Object> getTestInstance() {
74-
return Optional.ofNullable(this.testInstance);
75-
}
76-
7765
@Override
7866
public void publishReportEntry(Map<String, String> values) {
7967
engineExecutionListener.reportingEntryPublished(this.testDescriptor, ReportEntry.from(values));

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.lang.reflect.Method;
1717
import java.util.Optional;
1818

19-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
19+
import org.junit.jupiter.api.extension.ExtensionContext;
2020
import org.junit.jupiter.engine.execution.ThrowableCollector;
2121
import org.junit.platform.commons.meta.API;
2222
import org.junit.platform.engine.EngineExecutionListener;
@@ -28,8 +28,9 @@
2828
public final class ClassExtensionContext extends AbstractExtensionContext<ClassTestDescriptor> {
2929

3030
private final ThrowableCollector throwableCollector;
31+
private Object testInstance;
3132

32-
public ClassExtensionContext(AbstractExtensionContext<?> parent, EngineExecutionListener engineExecutionListener,
33+
public ClassExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
3334
ClassTestDescriptor testDescriptor, ThrowableCollector throwableCollector) {
3435

3536
super(parent, engineExecutionListener, testDescriptor);
@@ -46,6 +47,15 @@ public Optional<Class<?>> getTestClass() {
4647
return Optional.of(getTestDescriptor().getTestClass());
4748
}
4849

50+
void setTestInstance(Object testInstance) {
51+
this.testInstance = testInstance;
52+
}
53+
54+
@Override
55+
public Optional<Object> getTestInstance() {
56+
return Optional.ofNullable(this.testInstance);
57+
}
58+
4959
@Override
5060
public Optional<Method> getTestMethod() {
5161
return Optional.empty();

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

Lines changed: 17 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.Collections;
2323
import java.util.List;
2424
import java.util.Set;
25+
import java.util.function.Consumer;
2526
import java.util.function.Function;
2627

2728
import org.junit.jupiter.api.TestInstance;
@@ -31,7 +32,6 @@
3132
import org.junit.jupiter.api.extension.Extension;
3233
import org.junit.jupiter.api.extension.ExtensionContext;
3334
import org.junit.jupiter.api.extension.TestInstancePostProcessor;
34-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
3535
import org.junit.jupiter.engine.execution.AfterEachMethodAdapter;
3636
import org.junit.jupiter.engine.execution.BeforeEachMethodAdapter;
3737
import org.junit.jupiter.engine.execution.ExecutableInvoker;
@@ -176,50 +176,39 @@ private TestInstanceProvider testInstanceProvider(JupiterEngineExecutionContext
176176
if (this.lifecycle == Lifecycle.PER_CLASS) {
177177
// Eagerly load test instance for BeforeAllCallbacks, if necessary,
178178
// and store the instance in the ExtensionContext.
179-
// Note: as a side effect, instantiateAndPostProcessTestInstance() also stores
180-
// the instance it creates in the "current" extension context.
181-
Object instance = instantiateAndPostProcessTestInstance(parentExecutionContext, extensionContext, registry);
182-
183-
// Return a TestInstanceProvider that additionally sets the test instance
184-
// in the supplied child extension context (e.g., a MethodExtensionContext).
185-
return (childContext, childRegistry) -> {
186-
childContext.setTestInstance(instance);
187-
return instance;
188-
};
179+
Object instance = instantiateAndPostProcessTestInstance(parentExecutionContext, extensionContext, registry,
180+
extensionContext::setTestInstance);
181+
return childRegistry -> instance;
189182
}
190183

191184
// else Lifecycle.PER_METHOD
192-
return (childContext, childRegistry) -> instantiateAndPostProcessTestInstance(parentExecutionContext,
193-
childContext, childRegistry.orElse(registry));
185+
return childRegistry -> instantiateAndPostProcessTestInstance(parentExecutionContext, extensionContext,
186+
childRegistry.orElse(registry), instance -> {
187+
// no extension context update required
188+
});
194189
}
195190

196-
/**
197-
* Instantiate the test instance; set the test instance in the supplied
198-
* extension context; and post process the test instance.
199-
*
200-
* @see #instantiateTestClass
201-
* @see AbstractExtensionContext#setTestInstance
202-
* @see #invokeTestInstancePostProcessors
203-
*/
204191
private Object instantiateAndPostProcessTestInstance(JupiterEngineExecutionContext context,
205-
AbstractExtensionContext<?> extensionContext, ExtensionRegistry registry) {
192+
ExtensionContext extensionContext, ExtensionRegistry registry, Consumer<Object> testInstanceConsumer) {
206193

207194
Object instance = instantiateTestClass(context, registry, extensionContext);
208-
extensionContext.setTestInstance(instance);
209-
invokeTestInstancePostProcessors(registry, extensionContext);
195+
testInstanceConsumer.accept(instance);
196+
invokeTestInstancePostProcessors(instance, registry, extensionContext);
210197
return instance;
211198
}
212199

213200
protected Object instantiateTestClass(JupiterEngineExecutionContext parentExecutionContext,
214-
ExtensionRegistry registry, AbstractExtensionContext<?> extensionContext) {
201+
ExtensionRegistry registry, ExtensionContext extensionContext) {
215202

216203
Constructor<?> constructor = ReflectionUtils.getDeclaredConstructor(this.testClass);
217204
return executableInvoker.invoke(constructor, extensionContext, registry);
218205
}
219206

220-
private void invokeTestInstancePostProcessors(ExtensionRegistry registry, ExtensionContext context) {
207+
private void invokeTestInstancePostProcessors(Object instance, ExtensionRegistry registry,
208+
ExtensionContext context) {
209+
221210
registry.stream(TestInstancePostProcessor.class).forEach(
222-
extension -> executeAndMaskThrowable(() -> extension.postProcessTestInstance(context)));
211+
extension -> executeAndMaskThrowable(() -> extension.postProcessTestInstance(instance, context)));
223212
}
224213

225214
private void invokeBeforeAllCallbacks(JupiterEngineExecutionContext context) {
@@ -300,6 +289,7 @@ private AfterEachMethodAdapter synthesizeAfterEachMethodAdapter(Method method) {
300289
}
301290

302291
private void invokeMethodInExtensionContext(Method method, ExtensionContext context, ExtensionRegistry registry) {
292+
303293
Object testInstance = context.getTestInstance().orElseThrow(() -> new JUnitException(
304294
"Illegal state: test instance not present for method: " + method.toGenericString()));
305295

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import static org.junit.jupiter.engine.extension.ExtensionRegistry.createRegistryWithDefaultExtensions;
1414
import static org.junit.platform.commons.meta.API.Usage.Internal;
1515

16-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
16+
import org.junit.jupiter.api.extension.ExtensionContext;
1717
import org.junit.jupiter.engine.execution.JupiterEngineExecutionContext;
1818
import org.junit.jupiter.engine.extension.ExtensionRegistry;
1919
import org.junit.platform.commons.meta.API;
@@ -36,7 +36,7 @@ public JupiterEngineDescriptor(UniqueId uniqueId) {
3636
public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext context) throws Exception {
3737
ExtensionRegistry extensionRegistry = createRegistryWithDefaultExtensions(context.getConfigurationParameters());
3838
EngineExecutionListener executionListener = context.getExecutionListener();
39-
AbstractExtensionContext<?> extensionContext = new JupiterEngineExtensionContext(executionListener, this);
39+
ExtensionContext extensionContext = new JupiterEngineExtensionContext(executionListener, this);
4040

4141
// @formatter:off
4242
return context.extend()

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import java.lang.reflect.Method;
1717
import java.util.Optional;
1818

19-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
2019
import org.junit.platform.commons.meta.API;
2120
import org.junit.platform.engine.EngineExecutionListener;
2221

@@ -41,6 +40,11 @@ public Optional<Class<?>> getTestClass() {
4140
return Optional.empty();
4241
}
4342

43+
@Override
44+
public Optional<Object> getTestInstance() {
45+
return Optional.empty();
46+
}
47+
4448
@Override
4549
public Optional<Method> getTestMethod() {
4650
return Optional.empty();

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import java.lang.reflect.Method;
1717
import java.util.Optional;
1818

19-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
19+
import org.junit.jupiter.api.extension.ExtensionContext;
2020
import org.junit.jupiter.engine.execution.ThrowableCollector;
2121
import org.junit.platform.commons.meta.API;
2222
import org.junit.platform.engine.EngineExecutionListener;
@@ -27,13 +27,16 @@
2727
@API(Internal)
2828
public final class MethodExtensionContext extends AbstractExtensionContext<MethodTestDescriptor> {
2929

30+
private final Object testInstance;
31+
3032
private final ThrowableCollector throwableCollector;
3133

32-
public MethodExtensionContext(AbstractExtensionContext<?> parent, EngineExecutionListener engineExecutionListener,
33-
MethodTestDescriptor testDescriptor, ThrowableCollector throwableCollector) {
34+
public MethodExtensionContext(ExtensionContext parent, EngineExecutionListener engineExecutionListener,
35+
MethodTestDescriptor testDescriptor, Object testInstance, ThrowableCollector throwableCollector) {
3436

3537
super(parent, engineExecutionListener, testDescriptor);
3638

39+
this.testInstance = testInstance;
3740
this.throwableCollector = throwableCollector;
3841
}
3942

@@ -52,6 +55,11 @@ public Optional<Method> getTestMethod() {
5255
return Optional.of(getTestDescriptor().getTestMethod());
5356
}
5457

58+
@Override
59+
public Optional<Object> getTestInstance() {
60+
return Optional.of(this.testInstance);
61+
}
62+
5563
@Override
5664
public Optional<Throwable> getExecutionException() {
5765
return Optional.ofNullable(this.throwableCollector.getThrowable());

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

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.junit.jupiter.api.extension.ExtensionContext;
2626
import org.junit.jupiter.api.extension.TestExecutionExceptionHandler;
2727
import org.junit.jupiter.api.function.Executable;
28-
import org.junit.jupiter.engine.execution.AbstractExtensionContext;
2928
import org.junit.jupiter.engine.execution.AfterEachMethodAdapter;
3029
import org.junit.jupiter.engine.execution.BeforeEachMethodAdapter;
3130
import org.junit.jupiter.engine.execution.ExecutableInvoker;
@@ -79,15 +78,10 @@ public Type getType() {
7978
@Override
8079
public JupiterEngineExecutionContext prepare(JupiterEngineExecutionContext context) throws Exception {
8180
ExtensionRegistry registry = populateNewExtensionRegistry(context);
81+
Object testInstance = context.getTestInstanceProvider().getTestInstance(Optional.of(registry));
8282
ThrowableCollector throwableCollector = new ThrowableCollector();
83-
AbstractExtensionContext<?> extensionContext = new MethodExtensionContext(context.getExtensionContext(),
84-
context.getExecutionListener(), this, throwableCollector);
85-
86-
// Even though we (intentionally) ignore the return value, the following line
87-
// is required since the configured TestInstanceProvider is responsible for
88-
// setting the test instance in the supplied extension context.
89-
// See ClassTestDescriptor#testInstanceProvider(...) for details.
90-
context.getTestInstanceProvider().getTestInstance(extensionContext, Optional.of(registry));
83+
ExtensionContext extensionContext = new MethodExtensionContext(context.getExtensionContext(),
84+
context.getExecutionListener(), this, testInstance, throwableCollector);
9185

9286
// @formatter:off
9387
return context.extend()
@@ -105,7 +99,6 @@ protected ExtensionRegistry populateNewExtensionRegistry(JupiterEngineExecutionC
10599
@Override
106100
public JupiterEngineExecutionContext execute(JupiterEngineExecutionContext context,
107101
DynamicTestExecutor dynamicTestExecutor) throws Exception {
108-
109102
ThrowableCollector throwableCollector = context.getThrowableCollector();
110103

111104
// @formatter:off

0 commit comments

Comments
 (0)