Polishing
This commit is contained in:
parent
08e0baac94
commit
e23c8bfbb6
|
@ -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";
|
||||
|
|
Loading…
Reference in New Issue