Skip to content

Commit 48df362

Browse files
committed
Merge branch '6.2.x'
2 parents 63daa7a + 63f4ba4 commit 48df362

File tree

2 files changed

+37
-22
lines changed

2 files changed

+37
-22
lines changed

Diff for: spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistry.java

+18-21
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616

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

19-
import java.lang.reflect.Field;
2019
import java.util.LinkedHashMap;
2120
import java.util.List;
2221
import java.util.Map;
@@ -25,16 +24,14 @@
2524
import org.apache.commons.logging.Log;
2625
import org.apache.commons.logging.LogFactory;
2726

28-
import org.springframework.beans.factory.BeanCreationException;
2927
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
28+
import org.springframework.lang.Nullable;
3029
import org.springframework.util.Assert;
31-
import org.springframework.util.ReflectionUtils;
32-
import org.springframework.util.StringUtils;
3330

3431
/**
3532
* An internal class used to track {@link BeanOverrideHandler}-related state after
36-
* the bean factory has been processed and to provide field injection utilities
37-
* for test execution listeners.
33+
* the bean factory has been processed and to provide lookup facilities to test
34+
* execution listeners.
3835
*
3936
* @author Simon Baslé
4037
* @author Sam Brannen
@@ -63,6 +60,7 @@ class BeanOverrideRegistry {
6360
* <p>Also associates a {@linkplain BeanOverrideStrategy#WRAP "wrapping"} handler
6461
* with the given {@code beanName}, allowing for subsequent wrapping of the
6562
* bean via {@link #wrapBeanIfNecessary(Object, String)}.
63+
* @see #getBeanForHandler(BeanOverrideHandler, Class)
6664
*/
6765
void registerBeanOverrideHandler(BeanOverrideHandler handler, String beanName) {
6866
Assert.state(!this.handlerToBeanNameMap.containsKey(handler), () ->
@@ -107,23 +105,22 @@ Object wrapBeanIfNecessary(Object bean, String beanName) {
107105
return handler.createOverrideInstance(beanName, null, bean, this.beanFactory);
108106
}
109107

110-
void inject(Object target, BeanOverrideHandler handler) {
111-
Field field = handler.getField();
112-
Assert.notNull(field, () -> "BeanOverrideHandler must have a non-null field: " + handler);
108+
/**
109+
* Get the bean instance that was created by the provided {@link BeanOverrideHandler}.
110+
* @param handler the {@code BeanOverrideHandler} that created the bean
111+
* @param requiredType the required bean type
112+
* @return the bean instance, or {@code null} if the provided handler is not
113+
* registered in this registry
114+
* @since 6.2.6
115+
* @see #registerBeanOverrideHandler(BeanOverrideHandler, String)
116+
*/
117+
@Nullable
118+
Object getBeanForHandler(BeanOverrideHandler handler, Class<?> requiredType) {
113119
String beanName = this.handlerToBeanNameMap.get(handler);
114-
Assert.state(StringUtils.hasLength(beanName), () -> "No bean found for BeanOverrideHandler: " + handler);
115-
inject(field, target, beanName);
116-
}
117-
118-
private void inject(Field field, Object target, String beanName) {
119-
try {
120-
Object bean = this.beanFactory.getBean(beanName, field.getType());
121-
ReflectionUtils.makeAccessible(field);
122-
ReflectionUtils.setField(field, target, bean);
123-
}
124-
catch (Throwable ex) {
125-
throw new BeanCreationException("Could not inject field '" + field + "'", ex);
120+
if (beanName != null) {
121+
return this.beanFactory.getBean(beanName, requiredType);
126122
}
123+
return null;
127124
}
128125

129126
}

Diff for: spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java

+19-1
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,15 @@
1616

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

19+
import java.lang.reflect.Field;
1920
import java.util.List;
2021

22+
import org.springframework.beans.factory.BeanCreationException;
2123
import org.springframework.test.context.TestContext;
2224
import org.springframework.test.context.support.AbstractTestExecutionListener;
2325
import org.springframework.test.context.support.DependencyInjectionTestExecutionListener;
26+
import org.springframework.util.Assert;
27+
import org.springframework.util.ReflectionUtils;
2428

2529
/**
2630
* {@code TestExecutionListener} that enables {@link BeanOverride @BeanOverride}
@@ -94,9 +98,23 @@ private static void injectFields(TestContext testContext) {
9498
.getBean(BeanOverrideContextCustomizer.REGISTRY_BEAN_NAME, BeanOverrideRegistry.class);
9599

96100
for (BeanOverrideHandler handler : handlers) {
97-
beanOverrideRegistry.inject(testInstance, handler);
101+
Field field = handler.getField();
102+
Assert.state(field != null, () -> "BeanOverrideHandler must have a non-null field: " + handler);
103+
Object bean = beanOverrideRegistry.getBeanForHandler(handler, field.getType());
104+
Assert.state(bean != null, () -> "No bean found for BeanOverrideHandler: " + handler);
105+
injectField(field, testInstance, bean);
98106
}
99107
}
100108
}
101109

110+
private static void injectField(Field field, Object target, Object bean) {
111+
try {
112+
ReflectionUtils.makeAccessible(field);
113+
ReflectionUtils.setField(field, target, bean);
114+
}
115+
catch (Throwable ex) {
116+
throw new BeanCreationException("Could not inject field '" + field + "'", ex);
117+
}
118+
}
119+
102120
}

0 commit comments

Comments
 (0)