Skip to content

Commit dbbc578

Browse files
committed
Polishing
Inline `AbstractMockitoTestExecutionListener` since there's now only one Mockito `TestExecutionListener`.
1 parent 6f79c7e commit dbbc578

File tree

2 files changed

+71
-104
lines changed

2 files changed

+71
-104
lines changed

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/AbstractMockitoTestExecutionListener.java

Lines changed: 0 additions & 103 deletions
This file was deleted.

spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockitoResetTestExecutionListener.java

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616

1717
package org.springframework.test.context.bean.override.mockito;
1818

19+
import java.lang.reflect.Field;
1920
import java.util.Arrays;
2021
import java.util.HashSet;
2122
import java.util.Set;
23+
import java.util.function.Predicate;
2224

2325
import org.mockito.Mockito;
2426

@@ -30,8 +32,13 @@
3032
import org.springframework.context.ApplicationContext;
3133
import org.springframework.context.ConfigurableApplicationContext;
3234
import org.springframework.core.Ordered;
35+
import org.springframework.core.annotation.MergedAnnotation;
36+
import org.springframework.core.annotation.MergedAnnotations;
3337
import org.springframework.lang.Nullable;
3438
import org.springframework.test.context.TestContext;
39+
import org.springframework.test.context.TestContextAnnotationUtils;
40+
import org.springframework.test.context.support.AbstractTestExecutionListener;
41+
import org.springframework.util.ClassUtils;
3542

3643
/**
3744
* {@code TestExecutionListener} that resets any mock beans that have been marked
@@ -43,7 +50,17 @@
4350
* @see MockitoBean @MockitoBean
4451
* @see MockitoSpyBean @MockitoSpyBean
4552
*/
46-
public class MockitoResetTestExecutionListener extends AbstractMockitoTestExecutionListener {
53+
public class MockitoResetTestExecutionListener extends AbstractTestExecutionListener {
54+
55+
static final boolean mockitoPresent = ClassUtils.isPresent("org.mockito.Mockito",
56+
MockitoResetTestExecutionListener.class.getClassLoader());
57+
58+
private static final String SPRING_MOCKITO_PACKAGE = "org.springframework.test.context.bean.override.mockito";
59+
60+
private static final Predicate<MergedAnnotation<?>> isMockitoAnnotation = mergedAnnotation -> {
61+
String packageName = mergedAnnotation.getType().getPackageName();
62+
return packageName.startsWith(SPRING_MOCKITO_PACKAGE);
63+
};
4764

4865
/**
4966
* Executes before {@link org.springframework.test.context.bean.override.BeanOverrideTestExecutionListener}.
@@ -67,6 +84,7 @@ public void afterTestMethod(TestContext testContext) {
6784
}
6885
}
6986

87+
7088
private void resetMocks(ApplicationContext applicationContext, MockReset reset) {
7189
if (applicationContext instanceof ConfigurableApplicationContext configurableContext) {
7290
resetMocks(configurableContext, reset);
@@ -119,4 +137,56 @@ private static boolean isStandardBeanOrSingletonFactoryBean(BeanFactory beanFact
119137
return true;
120138
}
121139

140+
/**
141+
* Determine if the test class for the supplied {@linkplain TestContext
142+
* test context} uses any of the annotations in this package (such as
143+
* {@link MockitoBean @MockitoBean}).
144+
*/
145+
static boolean hasMockitoAnnotations(TestContext testContext) {
146+
return hasMockitoAnnotations(testContext.getTestClass());
147+
}
148+
149+
/**
150+
* Determine if Mockito annotations are declared on the supplied class, on an
151+
* interface it implements, on a superclass, or on an enclosing class or
152+
* whether a field in any such class is annotated with a Mockito annotation.
153+
*/
154+
private static boolean hasMockitoAnnotations(Class<?> clazz) {
155+
// Declared on the class?
156+
if (MergedAnnotations.from(clazz, MergedAnnotations.SearchStrategy.DIRECT).stream().anyMatch(isMockitoAnnotation)) {
157+
return true;
158+
}
159+
160+
// Declared on a field?
161+
for (Field field : clazz.getDeclaredFields()) {
162+
if (MergedAnnotations.from(field, MergedAnnotations.SearchStrategy.DIRECT).stream().anyMatch(isMockitoAnnotation)) {
163+
return true;
164+
}
165+
}
166+
167+
// Declared on an interface?
168+
for (Class<?> ifc : clazz.getInterfaces()) {
169+
if (hasMockitoAnnotations(ifc)) {
170+
return true;
171+
}
172+
}
173+
174+
// Declared on a superclass?
175+
Class<?> superclass = clazz.getSuperclass();
176+
if (superclass != null & superclass != Object.class) {
177+
if (hasMockitoAnnotations(superclass)) {
178+
return true;
179+
}
180+
}
181+
182+
// Declared on an enclosing class of an inner class?
183+
if (TestContextAnnotationUtils.searchEnclosingClass(clazz)) {
184+
if (hasMockitoAnnotations(clazz.getEnclosingClass())) {
185+
return true;
186+
}
187+
}
188+
189+
return false;
190+
}
191+
122192
}

0 commit comments

Comments
 (0)