diff --git a/spring-core/src/main/java/org/springframework/util/StringUtils.java b/spring-core/src/main/java/org/springframework/util/StringUtils.java index f26355f7212..86fc164c8cf 100644 --- a/spring-core/src/main/java/org/springframework/util/StringUtils.java +++ b/spring-core/src/main/java/org/springframework/util/StringUtils.java @@ -80,7 +80,7 @@ public abstract class StringUtils { private static final String CURRENT_PATH = "."; - private static final char EXTENSION_SEPARATOR = '.'; + private static final char DOT_CHAR = '.'; private static final int DEFAULT_TRUNCATION_THRESHOLD = 100; @@ -538,7 +538,7 @@ public abstract class StringUtils { * @param qualifiedName the qualified name */ public static String unqualify(String qualifiedName) { - return unqualify(qualifiedName, '.'); + return unqualify(qualifiedName, DOT_CHAR); } /** @@ -641,7 +641,7 @@ public abstract class StringUtils { return null; } - int extIndex = path.lastIndexOf(EXTENSION_SEPARATOR); + int extIndex = path.lastIndexOf(DOT_CHAR); if (extIndex == -1) { return null; } @@ -661,7 +661,7 @@ public abstract class StringUtils { * @return the path with stripped filename extension */ public static String stripFilenameExtension(String path) { - int extIndex = path.lastIndexOf(EXTENSION_SEPARATOR); + int extIndex = path.lastIndexOf(DOT_CHAR); if (extIndex == -1) { return path; } @@ -724,7 +724,7 @@ public abstract class StringUtils { String pathToUse = normalizedPath; // Shortcut if there is no work to do - if (pathToUse.indexOf(EXTENSION_SEPARATOR) == -1) { + if (pathToUse.indexOf(DOT_CHAR) == -1) { return pathToUse; } diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java index 0a27f880092..8028ba38988 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideBeanFactoryPostProcessor.java @@ -109,7 +109,7 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor, if (!(beanFactory instanceof BeanDefinitionRegistry registry)) { throw new IllegalStateException("Cannot process bean override with a BeanFactory " + - "that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass()); + "that doesn't implement BeanDefinitionRegistry: " + beanFactory.getClass().getName()); } // The following is a "pseudo" bean definition which MUST NOT be used to @@ -176,10 +176,12 @@ class BeanOverrideBeanFactoryPostProcessor implements BeanFactoryPostProcessor, int candidateCount = candidateNames.size(); if (candidateCount != 1) { Field field = overrideMetadata.getField(); - throw new IllegalStateException("Unable to select a bean to override by wrapping: found " + - candidateCount + " bean instances of type " + overrideMetadata.getBeanType() + - " (as required by annotated field '" + field.getDeclaringClass().getSimpleName() + - "." + field.getName() + "')" + (candidateCount > 0 ? ": " + candidateNames : "")); + throw new IllegalStateException(""" + Unable to select a bean to override by wrapping: found %d bean instances of type %s \ + (as required by annotated field '%s.%s')%s""" + .formatted(candidateCount, overrideMetadata.getBeanType(), + field.getDeclaringClass().getSimpleName(), field.getName(), + (candidateCount > 0 ? ": " + candidateNames : ""))); } beanName = BeanFactoryUtils.transformedBeanName(candidateNames.iterator().next()); } diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java index 0b1d3907012..07df3d4f087 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideContextCustomizer.java @@ -58,7 +58,7 @@ class BeanOverrideContextCustomizer implements ContextCustomizer { public void customizeContext(ConfigurableApplicationContext context, MergedContextConfiguration mergedConfig) { if (!(context instanceof BeanDefinitionRegistry registry)) { throw new IllegalStateException("Cannot process bean overrides with an ApplicationContext " + - "that doesn't implement BeanDefinitionRegistry: " + context.getClass()); + "that doesn't implement BeanDefinitionRegistry: " + context.getClass().getName()); } registerInfrastructure(registry); } diff --git a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java index 2dafdcf23cf..3d49207ef00 100644 --- a/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java +++ b/spring-test/src/main/java/org/springframework/test/context/bean/override/BeanOverrideRegistrar.java @@ -52,7 +52,7 @@ class BeanOverrideRegistrar implements BeanFactoryAware { public void setBeanFactory(BeanFactory beanFactory) throws BeansException { if (!(beanFactory instanceof ConfigurableBeanFactory cbf)) { throw new IllegalStateException("Cannot process bean override with a BeanFactory " + - "that doesn't implement ConfigurableBeanFactory: " + beanFactory.getClass()); + "that doesn't implement ConfigurableBeanFactory: " + beanFactory.getClass().getName()); } this.beanFactory = cbf; } 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 a9bc8fbdef8..7e117c4b182 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 @@ -49,29 +49,28 @@ public class BeanOverrideTestExecutionListener extends AbstractTestExecutionList @Override public void beforeTestMethod(TestContext testContext) throws Exception { - reinjectFieldsIfConfigured(testContext); + reinjectFieldsIfNecessary(testContext); } /** * Process the test instance and make sure that fields flagged for bean - * overriding are processed. - *
Each field's value will be updated with the overridden bean instance. + * overriding are injected with the overridden bean instance. */ protected void injectFields(TestContext testContext) { - postProcessFields(testContext, (testMetadata, overrideRegistrar) -> overrideRegistrar.inject( - testMetadata.testInstance, testMetadata.overrideMetadata)); + postProcessFields(testContext, (testMetadata, registrar) -> + registrar.inject(testMetadata.testInstance, testMetadata.overrideMetadata)); } /** * Process the test instance and make sure that fields flagged for bean - * overriding are processed. + * overriding are injected with the overridden bean instance, if necessary. *
If a fresh instance is required, the field is nulled out and then * re-injected with the overridden bean instance. *
This method does nothing if the * {@link DependencyInjectionTestExecutionListener#REINJECT_DEPENDENCIES_ATTRIBUTE} - * attribute is not present in the {@code TestContext}. + * attribute is not present in the {@code TestContext} with a value of {@link Boolean#TRUE}. */ - protected void reinjectFieldsIfConfigured(TestContext testContext) throws Exception { + protected void reinjectFieldsIfNecessary(TestContext testContext) throws Exception { if (Boolean.TRUE.equals( testContext.getAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE))) {