From 3bd342ee7d2d6097166e3aa402eb16e0d3ca0ec1 Mon Sep 17 00:00:00 2001 From: Sam Brannen <104798+sbrannen@users.noreply.github.com> Date: Tue, 19 Mar 2024 12:41:06 +0100 Subject: [PATCH] Polish bean override support in the TestContext framework --- .../bean/override/BeanOverrideBeanPostProcessor.java | 2 +- .../test/context/bean/override/BeanOverrideParser.java | 8 +++----- .../bean/override/BeanOverrideTestExecutionListener.java | 6 +++--- .../override/convention/TestBeanOverrideProcessor.java | 4 ++-- .../context/bean/override/mockito/MockDefinition.java | 2 +- .../test/context/bean/override/mockito/SpyDefinition.java | 2 +- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java index 37a11c2dd03..55148e67152 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanPostProcessor.java @@ -272,7 +272,7 @@ public class BeanOverrideBeanPostProcessor implements InstantiationAwareBeanPost private void inject(Field field, Object target, String beanName) { try { - field.setAccessible(true); + ReflectionUtils.makeAccessible(field); Object existingValue = ReflectionUtils.getField(field, target); Object bean = this.beanFactory.getBean(beanName, field.getType()); if (existingValue == bean) { diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java index 93586da1dc8..2d852ef1091 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideParser.java @@ -82,10 +82,8 @@ class BeanOverrideParser { if (hasBeanOverride.get()) { return; } - long count = MergedAnnotations.from(field, DIRECT) - .stream(BeanOverride.class) - .count(); - hasBeanOverride.compareAndSet(false, count > 0L); + boolean present = MergedAnnotations.from(field, DIRECT).isPresent(BeanOverride.class); + hasBeanOverride.compareAndSet(false, present); }); return hasBeanOverride.get(); } @@ -94,7 +92,7 @@ class BeanOverrideParser { AtomicBoolean overrideAnnotationFound = new AtomicBoolean(); MergedAnnotations.from(field, DIRECT).stream(BeanOverride.class).forEach(mergedAnnotation -> { - Assert.isTrue(mergedAnnotation.isMetaPresent(), "@BeanOverride annotation must be meta-present"); + Assert.state(mergedAnnotation.isMetaPresent(), "@BeanOverride annotation must be meta-present"); BeanOverride beanOverride = mergedAnnotation.synthesize(); BeanOverrideProcessor processor = BeanUtils.instantiateClass(beanOverride.value()); diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java index 0128db98894..41f5068fef2 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideTestExecutionListener.java @@ -28,7 +28,7 @@ import org.springframework.util.ReflectionUtils; * {@code TestExecutionListener} that enables Bean Override support in tests, * injecting overridden beans in appropriate fields of the test instance. * - *
Some flavors of Bean Override might additionally require the use of + *
Some Bean Override implementations might additionally require the use of * additional listeners, which should be mentioned in the javadoc for the * corresponding annotations. * @@ -62,7 +62,7 @@ public class BeanOverrideTestExecutionListener extends AbstractTestExecutionList */ protected void injectFields(TestContext testContext) { postProcessFields(testContext, (testMetadata, postProcessor) -> postProcessor.inject( - testMetadata.overrideMetadata.field(), testMetadata.testInstance(), testMetadata.overrideMetadata())); + testMetadata.overrideMetadata.field(), testMetadata.testInstance, testMetadata.overrideMetadata)); } /** @@ -73,7 +73,7 @@ public class BeanOverrideTestExecutionListener extends AbstractTestExecutionList * {@link DependencyInjectionTestExecutionListener#REINJECT_DEPENDENCIES_ATTRIBUTE} * attribute is not present in the {@code TestContext}. */ - protected void reinjectFieldsIfConfigured(final TestContext testContext) throws Exception { + protected void reinjectFieldsIfConfigured(TestContext testContext) throws Exception { if (Boolean.TRUE.equals( testContext.getAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE))) { diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/convention/TestBeanOverrideProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/convention/TestBeanOverrideProcessor.java index e31239daf8c..011f8873e11 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/convention/TestBeanOverrideProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/convention/TestBeanOverrideProcessor.java @@ -89,12 +89,12 @@ public class TestBeanOverrideProcessor implements BeanOverrideProcessor { @Override public OverrideMetadata createMetadata(Field field, Annotation overrideAnnotation, ResolvableType typeToOverride) { - Class> declaringClass = field.getDeclaringClass(); // If we can, get an explicit method name right away; fail fast if it doesn't match. if (overrideAnnotation instanceof TestBean testBeanAnnotation) { Method overrideMethod = null; String beanName = null; if (!testBeanAnnotation.methodName().isBlank()) { + Class> declaringClass = field.getDeclaringClass(); overrideMethod = findTestBeanFactoryMethod(declaringClass, field.getType(), testBeanAnnotation.methodName()); } if (!testBeanAnnotation.name().isBlank()) { @@ -134,7 +134,7 @@ public class TestBeanOverrideProcessor implements BeanOverrideProcessor { @Override public String getBeanOverrideDescription() { - return "method convention"; + return "@TestBean"; } @Override diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java index ff7aedd5b96..24fb55f6cb7 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/MockDefinition.java @@ -71,7 +71,7 @@ class MockDefinition extends Definition { @Override public String getBeanOverrideDescription() { - return "mock"; + return "@MockitoBean"; } @Override diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/SpyDefinition.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/SpyDefinition.java index 6bf70473dff..a832ff651cb 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/SpyDefinition.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/mockito/SpyDefinition.java @@ -61,7 +61,7 @@ class SpyDefinition extends Definition { @Override public String getBeanOverrideDescription() { - return "spy"; + return "@MockitoSpyBean"; } @Override