|
5 | 5 | package org.mockito.junit.jupiter; |
6 | 6 |
|
7 | 7 |
|
8 | | -import org.junit.jupiter.api.extension.*; |
| 8 | +import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create; |
| 9 | +import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; |
| 10 | + |
| 11 | +import java.lang.reflect.Parameter; |
| 12 | +import java.util.LinkedHashSet; |
| 13 | +import java.util.Optional; |
| 14 | +import java.util.Set; |
| 15 | +import org.junit.jupiter.api.extension.AfterEachCallback; |
| 16 | +import org.junit.jupiter.api.extension.BeforeEachCallback; |
| 17 | +import org.junit.jupiter.api.extension.ExtensionContext; |
9 | 18 | import org.junit.jupiter.api.extension.ExtensionContext.Namespace; |
| 19 | +import org.junit.jupiter.api.extension.ParameterContext; |
| 20 | +import org.junit.jupiter.api.extension.ParameterResolutionException; |
| 21 | +import org.junit.jupiter.api.extension.ParameterResolver; |
| 22 | +import org.junit.jupiter.api.extension.TestInstancePostProcessor; |
10 | 23 | import org.mockito.Mock; |
11 | 24 | import org.mockito.Mockito; |
12 | 25 | import org.mockito.MockitoSession; |
| 26 | +import org.mockito.internal.configuration.MockAnnotationProcessor; |
13 | 27 | import org.mockito.internal.configuration.plugins.Plugins; |
14 | 28 | import org.mockito.internal.session.MockitoSessionLoggerAdapter; |
15 | | -import org.mockito.internal.configuration.MockAnnotationProcessor; |
16 | 29 | import org.mockito.junit.MockitoJUnitRunner; |
17 | 30 | import org.mockito.quality.Strictness; |
18 | 31 |
|
19 | | -import java.lang.reflect.Parameter; |
20 | | -import java.util.LinkedHashSet; |
21 | | -import java.util.Optional; |
22 | | -import java.util.Set; |
23 | | - |
24 | | -import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create; |
25 | | -import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation; |
26 | | - |
27 | 32 | /** |
28 | 33 | * Extension that initializes mocks and handles strict stubbings. This extension is the JUnit Jupiter equivalent |
29 | 34 | * of our JUnit4 {@link MockitoJUnitRunner}. |
@@ -188,19 +193,30 @@ private Optional<MockitoSettings> retrieveAnnotationFromTestClasses(final Extens |
188 | 193 | } |
189 | 194 |
|
190 | 195 | private void collectParentTestInstances(ExtensionContext context, Set<Object> testInstances) { |
191 | | - Optional<ExtensionContext> parent = context.getParent(); |
| 196 | + Optional<ExtensionContext> initialParent = context.getParent(); |
192 | 197 |
|
193 | | - while (parent.isPresent() && parent.get() != context.getRoot()) { |
194 | | - ExtensionContext parentContext = parent.get(); |
| 198 | + // Ignoring first parent avoids parallel execution issues |
| 199 | + // We can ignore the first parent because it has the test instance that is already in 'testInstances' |
| 200 | + // See how 'testInstances' is populated |
| 201 | + initialParent.ifPresent(parent -> collectParentTestInstance(parent.getParent(), context, testInstances)); |
| 202 | + } |
195 | 203 |
|
196 | | - Object testInstance = parentContext.getStore(MOCKITO).remove(TEST_INSTANCE); |
| 204 | + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") |
| 205 | + private void collectParentTestInstance( |
| 206 | + Optional<ExtensionContext> parent, ExtensionContext context, |
| 207 | + Set<Object> testInstances) { |
197 | 208 |
|
198 | | - if (testInstance != null) { |
199 | | - testInstances.add(testInstance); |
200 | | - } |
| 209 | + parent.ifPresent(currentParent -> { |
| 210 | + if (currentParent != context.getRoot()) { |
| 211 | + Object testInstance = currentParent.getStore(MOCKITO).remove(TEST_INSTANCE); |
201 | 212 |
|
202 | | - parent = parentContext.getParent(); |
203 | | - } |
| 213 | + if (testInstance != null) { |
| 214 | + testInstances.add(testInstance); |
| 215 | + } |
| 216 | + |
| 217 | + collectParentTestInstance(currentParent.getParent(), context, testInstances); |
| 218 | + } |
| 219 | + }); |
204 | 220 | } |
205 | 221 |
|
206 | 222 | /** |
|
0 commit comments