Polishing

This commit is contained in:
Sam Brannen 2024-10-30 15:38:38 +01:00
parent 08e0baac94
commit e23c8bfbb6
1 changed files with 34 additions and 36 deletions

View File

@ -27,7 +27,6 @@ import org.junit.jupiter.api.Test;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
@ -72,7 +71,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithMatchingBeanDefinition() {
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
context.registerBean("descriptionBean", String.class, () -> "Original");
context.refresh();
@ -81,7 +80,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithoutMatchingBeanDefinitionFails() {
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
assertThatIllegalStateException()
.isThrownBy(context::refresh)
@ -91,7 +90,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithMatchingBeanDefinitionAndWrongTypeFails() {
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
context.registerBean("descriptionBean", Integer.class, () -> -1);
assertThatIllegalStateException()
@ -117,7 +116,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
}
private AnnotationConfigApplicationContext prepareContextWithFactoryBean(Object objectTypeAttribute) {
AnnotationConfigApplicationContext context = createContext(CaseOverrideBeanProducedByFactoryBean.class);
AnnotationConfigApplicationContext context = createContext(OverrideBeanProducedByFactoryBeanTestCase.class);
// Register a TestFactoryBean that will not be overridden
context.registerBean("testFactoryBean", TestFactoryBean.class, TestFactoryBean::new);
// Register another TestFactoryBean that will be overridden
@ -129,7 +128,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByTypeWithSingleMatchingBean() {
AnnotationConfigApplicationContext context = createContext(CaseByType.class);
AnnotationConfigApplicationContext context = createContext(ByTypeTestCase.class);
context.registerBean("someInteger", Integer.class, () -> 1);
context.refresh();
@ -138,30 +137,30 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByTypeWithoutMatchingBeanFails() {
AnnotationConfigApplicationContext context = createContext(CaseByType.class);
AnnotationConfigApplicationContext context = createContext(ByTypeTestCase.class);
assertThatIllegalStateException()
.isThrownBy(context::refresh)
.withMessage("Unable to override bean: no beans of type java.lang.Integer " +
"(as required by annotated field 'CaseByType.counter')");
"(as required by annotated field 'ByTypeTestCase.counter')");
}
@Test
void replaceBeanByTypeWithMultipleMatchesAndNoQualifierFails() {
AnnotationConfigApplicationContext context = createContext(CaseByType.class);
void replaceBeanByTypeWithMultipleCandidatesAndNoQualifierFails() {
AnnotationConfigApplicationContext context = createContext(ByTypeTestCase.class);
context.registerBean("someInteger", Integer.class, () -> 1);
context.registerBean("anotherInteger", Integer.class, () -> 2);
assertThatIllegalStateException()
.isThrownBy(context::refresh)
.withMessage("Unable to select a bean to override: found 2 beans " +
"of type java.lang.Integer (as required by annotated field 'CaseByType.counter'): " +
"of type java.lang.Integer (as required by annotated field 'ByTypeTestCase.counter'): " +
"[someInteger, anotherInteger]");
}
@Test
void replaceBeanByTypeWithMultipleMatchesAndFieldNameAsFallbackQualifierMatches() {
AnnotationConfigApplicationContext context = createContext(CaseByType.class);
void replaceBeanByTypeWithMultipleCandidatesAndFieldNameAsFallbackQualifier() {
AnnotationConfigApplicationContext context = createContext(ByTypeTestCase.class);
context.registerBean("counter", Integer.class, () -> 1);
context.registerBean("someInteger", Integer.class, () -> 2);
context.refresh();
@ -206,7 +205,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void createOrReplaceBeanByNameWithMatchingBeanDefinition() {
AnnotationConfigApplicationContext context = createContext(CaseByNameWithReplaceOrCreateStrategy.class);
AnnotationConfigApplicationContext context = createContext(ByNameWithReplaceOrCreateStrategyTestCase.class);
context.registerBean("descriptionBean", String.class, () -> "Original");
context.refresh();
@ -215,7 +214,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void createOrReplaceBeanByNameWithoutMatchingDefinitionCreatesBeanDefinition() {
AnnotationConfigApplicationContext context = createContext(CaseByNameWithReplaceOrCreateStrategy.class);
AnnotationConfigApplicationContext context = createContext(ByNameWithReplaceOrCreateStrategyTestCase.class);
context.refresh();
assertThat(context.getBean("descriptionBean")).isEqualTo("overridden");
@ -223,7 +222,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void createOrReplaceBeanByTypeWithMatchingBean() {
AnnotationConfigApplicationContext context = createContext(CaseByTypeWithReplaceOrCreateStrategy.class);
AnnotationConfigApplicationContext context = createContext(ByTypeWithReplaceOrCreateStrategyTestCase.class);
context.registerBean("someBean", String.class, () -> "Original");
context.refresh();
@ -232,7 +231,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void createOrReplaceBeanByTypeWithoutMatchingDefinitionCreatesBeanDefinition() {
AnnotationConfigApplicationContext context = createContext(CaseByTypeWithReplaceOrCreateStrategy.class);
AnnotationConfigApplicationContext context = createContext(ByTypeWithReplaceOrCreateStrategyTestCase.class);
context.refresh();
String generatedBeanName = "java.lang.String#0";
@ -242,7 +241,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void postProcessorShouldNotTriggerEarlyInitialization() {
AnnotationConfigApplicationContext context = createContext(CaseByTypeWithReplaceOrCreateStrategy.class);
AnnotationConfigApplicationContext context = createContext(ByTypeWithReplaceOrCreateStrategyTestCase.class);
context.register(FactoryBeanRegisteringPostProcessor.class);
context.register(EarlyBeanInitializationDetector.class);
@ -252,7 +251,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithMatchingBeanDefinitionWithExplicitSingletonScope() {
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
RootBeanDefinition definition = new RootBeanDefinition(String.class, () -> "ORIGINAL");
definition.setScope(BeanDefinition.SCOPE_SINGLETON);
context.registerBeanDefinition("descriptionBean", definition);
@ -265,7 +264,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithMatchingBeanDefinitionForClassBasedSingletonFactoryBean() {
String beanName = "descriptionBean";
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(SingletonStringFactoryBean.class);
context.registerBeanDefinition(beanName, factoryBeanDefinition);
@ -277,7 +276,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test // gh-33800
void replaceBeanByNameWithMatchingBeanDefinitionForClassBasedNonSingletonFactoryBean() {
String beanName = "descriptionBean";
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(NonSingletonStringFactoryBean.class);
context.registerBeanDefinition(beanName, factoryBeanDefinition);
@ -314,7 +313,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
void replaceBeanByNameWithMatchingBeanDefinitionWithPrototypeScopeFails() {
String beanName = "descriptionBean";
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
RootBeanDefinition definition = new RootBeanDefinition(String.class, () -> "ORIGINAL");
definition.setScope(BeanDefinition.SCOPE_PROTOTYPE);
context.registerBeanDefinition(beanName, definition);
@ -329,7 +328,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
String beanName = "descriptionBean";
String scope = "customScope";
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
beanFactory.registerScope(scope, new SimpleThreadScope());
RootBeanDefinition definition = new RootBeanDefinition(String.class, () -> "ORIGINAL");
@ -356,7 +355,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void replaceBeanByNameWithMatchingBeanDefinitionRetainsPrimaryAndFallbackFlags() {
AnnotationConfigApplicationContext context = createContext(CaseByName.class);
AnnotationConfigApplicationContext context = createContext(ByNameTestCase.class);
RootBeanDefinition definition = new RootBeanDefinition(String.class, () -> "ORIGINAL");
definition.setPrimary(true);
definition.setFallback(true);
@ -373,7 +372,7 @@ class BeanOverrideBeanFactoryPostProcessorTests {
@Test
void qualifiedElementIsSetToBeanOverrideFieldForNonexistentBeanDefinition() {
AnnotationConfigApplicationContext context = createContext(CaseByNameWithQualifier.class);
AnnotationConfigApplicationContext context = createContext(TestBeanByNameTestCase.class);
assertThatNoException().isThrownBy(context::refresh);
assertThat(context.getBeanDefinition("descriptionBean"))
@ -384,12 +383,12 @@ class BeanOverrideBeanFactoryPostProcessorTests {
private void qualifiedElementIsField(RootBeanDefinition def) {
assertThat(def.getQualifiedElement()).isInstanceOfSatisfying(Field.class,
field -> {
assertThat(field.getDeclaringClass()).isEqualTo(CaseByNameWithQualifier.class);
assertThat(field.getDeclaringClass()).isEqualTo(TestBeanByNameTestCase.class);
assertThat(field.getName()).as("annotated field name").isEqualTo("description");
});
}
private AnnotationConfigApplicationContext createContext(Class<?> testClass) {
private static AnnotationConfigApplicationContext createContext(Class<?> testClass) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
Set<BeanOverrideHandler> handlers = new LinkedHashSet<>(BeanOverrideHandler.forTestClass(testClass));
new BeanOverrideContextCustomizer(handlers).customizeContext(context, mock(MergedContextConfiguration.class));
@ -409,35 +408,35 @@ class BeanOverrideBeanFactoryPostProcessorTests {
}
static class CaseByName {
static class ByNameTestCase {
@DummyBean(beanName = "descriptionBean")
private String description;
}
static class CaseByType {
static class ByTypeTestCase {
@DummyBean
private Integer counter;
}
static class CaseByNameWithReplaceOrCreateStrategy {
static class ByNameWithReplaceOrCreateStrategyTestCase {
@DummyBean(beanName = "descriptionBean", strategy = BeanOverrideStrategy.REPLACE_OR_CREATE)
private String description;
}
static class CaseByTypeWithReplaceOrCreateStrategy {
static class ByTypeWithReplaceOrCreateStrategyTestCase {
@DummyBean(strategy = BeanOverrideStrategy.REPLACE_OR_CREATE)
private String description;
}
static class CaseByNameAndByTypeWithReplaceOrCreateStrategy {
static class ByNameAndByTypeWithReplaceOrCreateStrategyTestCase {
@DummyBean(beanName = "descriptionBean", strategy = BeanOverrideStrategy.REPLACE_OR_CREATE)
private String description;
@ -447,18 +446,17 @@ class BeanOverrideBeanFactoryPostProcessorTests {
}
static class CaseOverrideBeanProducedByFactoryBean {
static class OverrideBeanProducedByFactoryBeanTestCase {
@DummyBean(beanName = "beanToBeOverridden")
CharSequence description;
}
static class CaseByNameWithQualifier {
static class TestBeanByNameTestCase {
@Qualifier("preferThis")
@TestBean(name = "descriptionBean")
private String description;
String description;
static String descriptionBean() {
return "overridden";