@ -20,6 +20,7 @@ import java.io.InputStream;
@@ -20,6 +20,7 @@ import java.io.InputStream;
import java.lang.annotation.Retention ;
import java.lang.annotation.RetentionPolicy ;
import java.lang.reflect.Executable ;
import java.lang.reflect.Method ;
import java.util.ArrayList ;
import java.util.List ;
import java.util.Map ;
@ -39,7 +40,7 @@ import org.springframework.beans.factory.BeanCurrentlyInCreationException;
@@ -39,7 +40,7 @@ import org.springframework.beans.factory.BeanCurrentlyInCreationException;
import org.springframework.beans.factory.ObjectProvider ;
import org.springframework.beans.factory.UnsatisfiedDependencyException ;
import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor ;
import org.springframework.beans.factory.aot.AutowiredInstantiationArgumentsResolv erTests.Enclosing.InnerSingleArgConstructor ;
import org.springframework.beans.factory.aot.BeanInstanceSuppli erTests.Enclosing.InnerSingleArgConstructor ;
import org.springframework.beans.factory.config.BeanDefinition ;
import org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder ;
import org.springframework.beans.factory.config.DependencyDescriptor ;
@ -54,6 +55,10 @@ import org.springframework.core.env.Environment;
@@ -54,6 +55,10 @@ import org.springframework.core.env.Environment;
import org.springframework.core.io.DefaultResourceLoader ;
import org.springframework.core.io.ResourceLoader ;
import org.springframework.util.ClassUtils ;
import org.springframework.util.ReflectionUtils ;
import org.springframework.util.function.ThrowingBiFunction ;
import org.springframework.util.function.ThrowingFunction ;
import org.springframework.util.function.ThrowingSupplier ;
import static org.assertj.core.api.Assertions.assertThat ;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType ;
@ -62,19 +67,19 @@ import static org.assertj.core.api.Assertions.entry;
@@ -62,19 +67,19 @@ import static org.assertj.core.api.Assertions.entry;
import static org.mockito.Mockito.mock ;
/ * *
* Tests for { @link AutowiredInstantiationArgumentsResolv er} .
* Tests for { @link BeanInstanceSuppli er} .
*
* @author Phillip Webb
* @author Stephane Nicoll
* /
class AutowiredInstantiationArgumentsResolv erTests {
class BeanInstanceSuppli erTests {
private final DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ( ) ;
@Test
void forConstructorWhenParameterTypesIsNullThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > AutowiredInstantiationArgumentsResolv er
. isThrownBy ( ( ) - > BeanInstanceSuppli er
. forConstructor ( ( Class < ? > [ ] ) null ) )
. withMessage ( "'parameterTypes' must not be null" ) ;
}
@ -82,27 +87,33 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -82,27 +87,33 @@ class AutowiredInstantiationArgumentsResolverTests {
@Test
void forConstructorWhenParameterTypesContainsNullThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > AutowiredInstantiationArgumentsResolv er
. isThrownBy ( ( ) - > BeanInstanceSuppli er
. forConstructor ( String . class , null ) )
. withMessage ( "'parameterTypes' must not contain null elements" ) ;
}
@Test
void forConstructorWhenNotFoundThrowsException ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolv er
BeanInstanceSupplier resolver = BeanInstanceSuppli er
. forConstructor ( InputStream . class ) ;
Source source = new Source ( SingleArgConstructor . class , resolver ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > resolver . resolve ( registerBean ) ) . withMessage (
. isThrownBy ( ( ) - > resolver . get ( registerBean ) ) . withMessage (
"Constructor with parameter types [java.io.InputStream] cannot be found on "
+ SingleArgConstructor . class . getName ( ) ) ;
}
@Test
void forConstructorReturnsNullFactoryMethod ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier . forConstructor ( String . class ) ;
assertThat ( resolver . getFactoryMethod ( ) ) . isNull ( ) ;
}
@Test
void forFactoryMethodWhenDeclaringClassIsNullThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > AutowiredInstantiationArgumentsResolver
. isThrownBy ( ( ) - > BeanInstanceSuppli er
. forFactoryMethod ( null , "test" ) )
. withMessage ( "'declaringClass' must not be null" ) ;
}
@ -110,7 +121,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -110,7 +121,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@Test
void forFactoryMethodWhenNameIsEmptyThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > AutowiredInstantiationArgumentsResolv er
. isThrownBy ( ( ) - > BeanInstanceSuppli er
. forFactoryMethod ( SingleArgFactory . class , "" ) )
. withMessage ( "'methodName' must not be empty" ) ;
}
@ -119,7 +130,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -119,7 +130,7 @@ class AutowiredInstantiationArgumentsResolverTests {
void forFactoryMethodWhenParameterTypesIsNullThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy (
( ) - > AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
( ) - > BeanInstanceSuppli er. forFactoryMethod (
SingleArgFactory . class , "single" , ( Class < ? > [ ] ) null ) )
. withMessage ( "'parameterTypes' must not be null" ) ;
}
@ -128,61 +139,136 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -128,61 +139,136 @@ class AutowiredInstantiationArgumentsResolverTests {
void forFactoryMethodWhenParameterTypesContainsNullThrowsException ( ) {
assertThatIllegalArgumentException ( )
. isThrownBy (
( ) - > AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
( ) - > BeanInstanceSuppli er. forFactoryMethod (
SingleArgFactory . class , "single" , String . class , null ) )
. withMessage ( "'parameterTypes' must not contain null elements" ) ;
}
@Test
void forFactoryMethodWhenNotFoundThrowsException ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolv er
BeanInstanceSupplier resolver = BeanInstanceSuppli er
. forFactoryMethod ( SingleArgFactory . class , "single" , InputStream . class ) ;
Source source = new Source ( String . class , resolver ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > resolver . resolve ( registerBean ) ) . withMessage (
. isThrownBy ( ( ) - > resolver . get ( registerBean ) ) . withMessage (
"Factory method 'single' with parameter types [java.io.InputStream] declared on class "
+ SingleArgFactory . class . getName ( ) + " cannot be found" ) ;
}
@Test
void resolveWithActionWhenActionIsNullThrowsException ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolver
void forFactoryMethodReturnsFactoryMethod ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forFactoryMethod ( SingleArgFactory . class , "single" , String . class ) ;
Method factoryMethod = ReflectionUtils . findMethod ( SingleArgFactory . class , "single" , String . class ) ;
assertThat ( factoryMethod ) . isNotNull ( ) ;
assertThat ( resolver . getFactoryMethod ( ) ) . isEqualTo ( factoryMethod ) ;
}
@Test
void withGeneratorWhenBiFunctionIsNullThrowsException ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( ) ;
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > resolver . withGenerator (
( ThrowingBiFunction < RegisteredBean , AutowiredArguments , Object > ) null ) )
. withMessage ( "'generator' must not be null" ) ;
}
@Test
void withGeneratorWhenFunctionIsNullThrowsException ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( ) ;
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > resolver . withGenerator (
( ThrowingFunction < RegisteredBean , Object > ) null ) )
. withMessage ( "'generator' must not be null" ) ;
}
@Test
void withGeneratorWhenSupplierIsNullThrowsException ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( ) ;
Source source = new Source ( NoArgConstructor . class , resolver ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
assertThatIllegalArgumentException ( )
. isThrownBy ( ( ) - > resolver . resolve ( registerBean , null ) )
. withMessage ( "'action' must not be null" ) ;
. isThrownBy ( ( ) - > resolver . withGenerator (
( ThrowingSupplier < Object > ) null ) )
. withMessage ( "'generator' must not be null" ) ;
}
@Test
void resolveWithActionCallsAction ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolver
void getWithConstructorDoesNotSetResolvedFactoryMethod ( ) throws Exception {
BeanInstanceSupplier resolver = BeanInstanceSuppli er
. forConstructor ( String . class ) ;
Source source = new Source ( SingleArgConstructor . class , resolver ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
Source source = new Source ( SingleArgConstructor . class , resolver ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
assertThat ( registerBean . getMergedBeanDefinition ( ) . getResolvedFactoryMethod ( ) ) . isNull ( ) ;
source . getResolver ( ) . get ( registerBean ) ;
assertThat ( registerBean . getMergedBeanDefinition ( ) . getResolvedFactoryMethod ( ) ) . isNull ( ) ;
}
@Test
void getWithFactoryMethodSetsResolvedFactoryMethod ( ) {
Method factoryMethod = ReflectionUtils . findMethod ( SingleArgFactory . class , "single" , String . class ) ;
assertThat ( factoryMethod ) . isNotNull ( ) ;
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forFactoryMethod ( SingleArgFactory . class , "single" , String . class ) ;
RootBeanDefinition beanDefinition = new RootBeanDefinition ( String . class ) ;
assertThat ( beanDefinition . getResolvedFactoryMethod ( ) ) . isNull ( ) ;
beanDefinition . setInstanceSupplier ( resolver ) ;
assertThat ( beanDefinition . getResolvedFactoryMethod ( ) ) . isEqualTo ( factoryMethod ) ;
}
@Test
void getWithGeneratorCallsBiFunction ( ) throws Exception {
BeanRegistrar registrar = new BeanRegistrar ( SingleArgConstructor . class ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registerBean = registrar . registerBean ( this . beanFactory ) ;
List < Object > result = new ArrayList < > ( ) ;
resolver . resolve ( registerBean , result : : add ) ;
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( String . class )
. withGenerator ( ( registeredBean , args ) - > result . add ( args ) ) ;
resolver . get ( registerBean ) ;
assertThat ( result ) . hasSize ( 1 ) ;
assertThat ( ( ( AutowiredArguments ) result . get ( 0 ) ) . toArray ( ) ) . containsExactly ( "1" ) ;
}
@Test
void resolveWhenRegisteredBeanIsNullThrowsException ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolver
void getWithGeneratorCallsFunction ( ) throws Exception {
BeanRegistrar registrar = new BeanRegistrar ( SingleArgConstructor . class ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registerBean = registrar . registerBean ( this . beanFactory ) ;
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( String . class )
. withGenerator ( registeredBean - > "1" ) ;
assertThat ( resolver . get ( registerBean ) ) . isInstanceOf ( String . class ) . isEqualTo ( "1" ) ;
}
@Test
void getWithGeneratorCallsSupplier ( ) throws Exception {
BeanRegistrar registrar = new BeanRegistrar ( SingleArgConstructor . class ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registerBean = registrar . registerBean ( this . beanFactory ) ;
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( String . class )
. withGenerator ( ( ) - > "1" ) ;
assertThat ( resolver . get ( registerBean ) ) . isInstanceOf ( String . class ) . isEqualTo ( "1" ) ;
}
@Test
void getWhenRegisteredBeanIsNullThrowsException ( ) {
BeanInstanceSupplier resolver = BeanInstanceSupplier
. forConstructor ( String . class ) ;
assertThatIllegalArgumentException ( ) . isThrownBy ( ( ) - > resolver . resolve ( null ) )
assertThatIllegalArgumentException ( ) . isThrownBy ( ( ) - > resolver . get ( ( RegisteredBean ) null ) )
. withMessage ( "'registeredBean' must not be null" ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveAndInstantiate ( Source source ) {
void getWithNoGeneratorUsesReflection ( Source source ) throws Exception {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "testFactory" , new SingleArgFactory ( ) ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
Object instance = source . getResolver ( ) . resolveAndInstantiate ( registerBean ) ;
Object instance = source . getResolver ( ) . get ( registerBean ) ;
if ( instance instanceof SingleArgConstructor singleArgConstructor ) {
instance = singleArgConstructor . getString ( ) ;
}
@ -190,12 +276,12 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -190,12 +276,12 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@ParameterizedResolverTest ( Sources . INNER_CLASS_SINGLE_ARG )
void resolveAndInstantiateNested ( Source source ) {
void getNestedWithNoGeneratorUsesReflection ( Source source ) throws Exception {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "testFactory" ,
new Enclosing ( ) . new InnerSingleArgFactory ( ) ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
Object instance = source . getResolver ( ) . resolveAndInstantiate ( registerBean ) ;
Object instance = source . getResolver ( ) . get ( registerBean ) ;
if ( instance instanceof InnerSingleArgConstructor innerSingleArgConstructor ) {
instance = innerSingleArgConstructor . getString ( ) ;
}
@ -203,38 +289,38 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -203,38 +289,38 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@Test
void resolveNoArgConstructor ( ) {
void resolveArgumentsWith NoArgConstructor ( ) {
RootBeanDefinition beanDefinition = new RootBeanDefinition (
NoArgConstructor . class ) ;
this . beanFactory . registerBeanDefinition ( "test" , beanDefinition ) ;
RegisteredBean registeredBean = RegisteredBean . of ( this . beanFactory , "test" ) ;
AutowiredArguments resolved = AutowiredInstantiationArgumentsResolv er
. forConstructor ( ) . resolve ( registeredBean ) ;
AutowiredArguments resolved = BeanInstanceSuppli er
. forConstructor ( ) . resolveArguments ( registeredBean ) ;
assertThat ( resolved . toArray ( ) ) . isEmpty ( ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveSingleArgConstructor ( Source source ) {
void resolveArgumentsWith SingleArgConstructor ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registeredBean = source . registerBean ( this . beanFactory ) ;
assertThat ( source . getResolver ( ) . resolve ( registeredBean ) . toArray ( ) )
assertThat ( source . getResolver ( ) . resolveArguments ( registeredBean ) . toArray ( ) )
. containsExactly ( "1" ) ;
}
@ParameterizedResolverTest ( Sources . INNER_CLASS_SINGLE_ARG )
void resolved NestedSingleArgConstructor ( Source source ) {
void resolveArgumentsWith NestedSingleArgConstructor ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registeredBean = source . registerBean ( this . beanFactory ) ;
assertThat ( source . getResolver ( ) . resolve ( registeredBean ) . toArray ( ) )
assertThat ( source . getResolver ( ) . resolveArguments ( registeredBean ) . toArray ( ) )
. containsExactly ( "1" ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveRequiredDependencyNotPresentThrowsUnsatisfiedDependencyException (
void resolveArgumentsWith RequiredDependencyNotPresentThrowsUnsatisfiedDependencyException (
Source source ) {
RegisteredBean registeredBean = source . registerBean ( this . beanFactory ) ;
assertThatExceptionOfType ( UnsatisfiedDependencyException . class )
. isThrownBy ( ( ) - > source . getResolver ( ) . resolve ( registeredBean ) )
. isThrownBy ( ( ) - > source . getResolver ( ) . resolveArguments ( registeredBean ) )
. satisfies ( ex - > {
assertThat ( ex . getBeanName ( ) ) . isEqualTo ( "testBean" ) ;
assertThat ( ex . getInjectionPoint ( ) ) . isNotNull ( ) ;
@ -244,16 +330,16 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -244,16 +330,16 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@Test
void resolveInInstanceSupplierWithSelfReferenceThrowsException ( ) {
void resolveArguments InInstanceSupplierWithSelfReferenceThrowsException ( ) {
// SingleArgFactory.single(...) expects a String to be injected
// and our own bean is a String so it's a valid candidate
// and our own bean is a String, so it's a valid candidate
this . beanFactory . addBeanPostProcessor ( new AutowiredAnnotationBeanPostProcessor ( ) ) ;
RootBeanDefinition beanDefinition = new RootBeanDefinition ( String . class ) ;
beanDefinition . setInstanceSupplier ( InstanceSupplier . of ( registeredBean - > {
AutowiredArguments args = AutowiredInstantiationArgumentsResolv er
AutowiredArguments args = BeanInstanceSuppli er
. forFactoryMethod ( SingleArgFactory . class , "single" , String . class )
. resolve ( registeredBean ) ;
return new SingleArgFactory ( ) . single ( ( String ) args . get ( 0 ) ) ;
. resolveArguments ( registeredBean ) ;
return new SingleArgFactory ( ) . single ( args . get ( 0 ) ) ;
} ) ) ;
this . beanFactory . registerBeanDefinition ( "test" , beanDefinition ) ;
assertThatExceptionOfType ( UnsatisfiedDependencyException . class )
@ -261,83 +347,83 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -261,83 +347,83 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@ParameterizedResolverTest ( Sources . ARRAY_OF_BEANS )
void resolveArrayOfBeans ( Source source ) {
void resolveArgumentsWithAr rayOfBeans ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "two" , "2" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Object [ ] ) arguments . get ( 0 ) ) . containsExactly ( "1" , "2" ) ;
}
@ParameterizedResolverTest ( Sources . ARRAY_OF_BEANS )
void resolveRequiredArrayOfBeansInjectEmptyArray ( Source source ) {
void resolveArgumentsWith RequiredArrayOfBeansInjectEmptyArray ( Source source ) {
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Object [ ] ) arguments . get ( 0 ) ) . isEmpty ( ) ;
}
@ParameterizedResolverTest ( Sources . LIST_OF_BEANS )
void resolveListOfBeans ( Source source ) {
void resolveArgumentsWith ListOfBeans ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "two" , "2" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isInstanceOf ( List . class ) . asList ( )
. containsExactly ( "1" , "2" ) ;
}
@ParameterizedResolverTest ( Sources . LIST_OF_BEANS )
void resolveRequiredListOfBeansInjectEmptyList ( Source source ) {
void resolveArgumentsWith RequiredListOfBeansInjectEmptyList ( Source source ) {
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( List < ? > ) arguments . get ( 0 ) ) . isEmpty ( ) ;
}
@ParameterizedResolverTest ( Sources . SET_OF_BEANS )
@SuppressWarnings ( "unchecked" )
void resolveSetOfBeans ( Source source ) {
void resolveArgumentsWith SetOfBeans ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "two" , "2" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Set < String > ) arguments . get ( 0 ) ) . containsExactly ( "1" , "2" ) ;
}
@ParameterizedResolverTest ( Sources . SET_OF_BEANS )
void resolveRequiredSetOfBeansInjectEmptySet ( Source source ) {
void resolveArgumentsWith RequiredSetOfBeansInjectEmptySet ( Source source ) {
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Set < ? > ) arguments . get ( 0 ) ) . isEmpty ( ) ;
}
@ParameterizedResolverTest ( Sources . MAP_OF_BEANS )
@SuppressWarnings ( "unchecked" )
void resolveMapOfBeans ( Source source ) {
void resolveArgumentsWith MapOfBeans ( Source source ) {
this . beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "two" , "2" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Map < String , String > ) arguments . get ( 0 ) )
. containsExactly ( entry ( "one" , "1" ) , entry ( "two" , "2" ) ) ;
}
@ParameterizedResolverTest ( Sources . MAP_OF_BEANS )
void resolveRequiredMapOfBeansInjectEmptySet ( Source source ) {
void resolveArgumentsWith RequiredMapOfBeansInjectEmptySet ( Source source ) {
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( ( Map < ? , ? > ) arguments . get ( 0 ) ) . isEmpty ( ) ;
}
@ParameterizedResolverTest ( Sources . MULTI_ARGS )
void resolveMultiArgsConstructor ( Source source ) {
void resolveArgumentsWith MultiArgsConstructor ( Source source ) {
ResourceLoader resourceLoader = new DefaultResourceLoader ( ) ;
Environment environment = mock ( Environment . class ) ;
this . beanFactory . registerResolvableDependency ( ResourceLoader . class ,
@ -345,7 +431,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -345,7 +431,7 @@ class AutowiredInstantiationArgumentsResolverTests {
this . beanFactory . registerSingleton ( "environment" , environment ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 3 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( resourceLoader ) ;
assertThat ( arguments . getObject ( 1 ) ) . isEqualTo ( environment ) ;
@ -354,7 +440,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -354,7 +440,7 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@ParameterizedResolverTest ( Sources . MIXED_ARGS )
void resolveMixedArgsConstructorWithUserValue ( Source source ) {
void resolveArgumentsWith MixedArgsConstructorWithUserValue ( Source source ) {
ResourceLoader resourceLoader = new DefaultResourceLoader ( ) ;
Environment environment = mock ( Environment . class ) ;
this . beanFactory . registerResolvableDependency ( ResourceLoader . class ,
@ -367,7 +453,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -367,7 +453,7 @@ class AutowiredInstantiationArgumentsResolverTests {
beanDefinition . getConstructorArgumentValues ( )
. addIndexedArgumentValue ( 1 , "user-value" ) ;
} ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 3 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( resourceLoader ) ;
assertThat ( arguments . getObject ( 1 ) ) . isEqualTo ( "user-value" ) ;
@ -375,7 +461,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -375,7 +461,7 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@ParameterizedResolverTest ( Sources . MIXED_ARGS )
void resolveMixedArgsConstructorWithUserBeanReference ( Source source ) {
void resolveArgumentsWith MixedArgsConstructorWithUserBeanReference ( Source source ) {
ResourceLoader resourceLoader = new DefaultResourceLoader ( ) ;
Environment environment = mock ( Environment . class ) ;
this . beanFactory . registerResolvableDependency ( ResourceLoader . class ,
@ -390,7 +476,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -390,7 +476,7 @@ class AutowiredInstantiationArgumentsResolverTests {
beanDefinition . getConstructorArgumentValues ( )
. addIndexedArgumentValue ( 1 , new RuntimeBeanReference ( "two" ) ) ;
} ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 3 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( resourceLoader ) ;
assertThat ( arguments . getObject ( 1 ) ) . isEqualTo ( "2" ) ;
@ -398,9 +484,9 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -398,9 +484,9 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@Test
void resolveUserValueWithTypeConversionRequired ( ) {
void resolveArgumentsWith UserValueWithTypeConversionRequired ( ) {
Source source = new Source ( CharDependency . class ,
AutowiredInstantiationArgumentsResolv er. forConstructor ( char . class ) ) ;
BeanInstanceSuppli er. forConstructor ( char . class ) ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ,
beanDefinition - > {
beanDefinition
@ -408,37 +494,37 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -408,37 +494,37 @@ class AutowiredInstantiationArgumentsResolverTests {
beanDefinition . getConstructorArgumentValues ( )
. addIndexedArgumentValue ( 0 , "\\" ) ;
} ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isInstanceOf ( Character . class ) . isEqualTo ( '\\' ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveUserValueWithBeanReference ( Source source ) {
void resolveArgumentsWith UserValueWithBeanReference ( Source source ) {
this . beanFactory . registerSingleton ( "stringBean" , "string" ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ,
beanDefinition - > beanDefinition . getConstructorArgumentValues ( )
. addIndexedArgumentValue ( 0 ,
new RuntimeBeanReference ( "stringBean" ) ) ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( "string" ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveUserValueWithBeanDefinition ( Source source ) {
void resolveArgumentsWith UserValueWithBeanDefinition ( Source source ) {
AbstractBeanDefinition userValue = BeanDefinitionBuilder
. rootBeanDefinition ( String . class , ( ) - > "string" ) . getBeanDefinition ( ) ;
RegisteredBean registerBean = source . registerBean ( this . beanFactory ,
beanDefinition - > beanDefinition . getConstructorArgumentValues ( )
. addIndexedArgumentValue ( 0 , userValue ) ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( "string" ) ;
}
@ParameterizedResolverTest ( Sources . SINGLE_ARG )
void resolveUserValueThatIsAlreadyResolved ( Source source ) {
void resolveArgumentsWith UserValueThatIsAlreadyResolved ( Source source ) {
RegisteredBean registerBean = source . registerBean ( this . beanFactory ) ;
BeanDefinition mergedBeanDefinition = this . beanFactory
. getMergedBeanDefinition ( "testBean" ) ;
@ -446,13 +532,13 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -446,13 +532,13 @@ class AutowiredInstantiationArgumentsResolverTests {
valueHolder . setConvertedValue ( "this is an a" ) ;
mergedBeanDefinition . getConstructorArgumentValues ( ) . addIndexedArgumentValue ( 0 ,
valueHolder ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolve ( registerBean ) ;
AutowiredArguments arguments = source . getResolver ( ) . resolveArguments ( registerBean ) ;
assertThat ( arguments . toArray ( ) ) . hasSize ( 1 ) ;
assertThat ( arguments . getObject ( 0 ) ) . isEqualTo ( "this is an a" ) ;
}
@Test
void resolveWhenUsingShortcutsInjectsDirectly ( ) {
void resolveArguments WhenUsingShortcutsInjectsDirectly ( ) {
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory ( ) {
@Override
@ -462,35 +548,35 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -462,35 +548,35 @@ class AutowiredInstantiationArgumentsResolverTests {
}
} ;
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolv er
BeanInstanceSupplier resolver = BeanInstanceSuppli er
. forConstructor ( String . class ) ;
Source source = new Source ( String . class , resolver ) ;
beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registeredBean = source . registerBean ( beanFactory ) ;
assertThatExceptionOfType ( AssertionError . class )
. isThrownBy ( ( ) - > resolver . resolve ( registeredBean ) ) ;
assertThat ( resolver . withShortcuts ( "one" ) . resolve ( registeredBean ) . toArray ( ) )
. isThrownBy ( ( ) - > resolver . resolveArguments ( registeredBean ) ) ;
assertThat ( resolver . withShortcuts ( "one" ) . resolveArguments ( registeredBean ) . toArray ( ) )
. containsExactly ( "1" ) ;
}
@Test
void resolveRegistersDependantBeans ( ) {
AutowiredInstantiationArgumentsResolver resolver = AutowiredInstantiationArgumentsResolv er
void resolveArguments RegistersDependantBeans ( ) {
BeanInstanceSupplier resolver = BeanInstanceSuppli er
. forConstructor ( String . class ) ;
Source source = new Source ( SingleArgConstructor . class , resolver ) ;
beanFactory . registerSingleton ( "one" , "1" ) ;
this . beanFactory . registerSingleton ( "one" , "1" ) ;
RegisteredBean registeredBean = source . registerBean ( this . beanFactory ) ;
resolver . resolve ( registeredBean ) ;
resolver . resolveArguments ( registeredBean ) ;
assertThat ( this . beanFactory . getDependentBeans ( "one" ) ) . containsExactly ( "testBean" ) ;
}
/ * *
* Parameterized { @link Using } test backed by a { @link Sources } .
* Parameterized test backed by a { @link Sources } .
* /
@Retention ( RetentionPolicy . RUNTIME )
@ParameterizedTest
@ArgumentsSource ( SourcesArguments . class )
static @interface ParameterizedResolverTest {
@interface ParameterizedResolverTest {
Sources value ( ) ;
@ -510,8 +596,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -510,8 +596,7 @@ class AutowiredInstantiationArgumentsResolverTests {
}
@Override
public Stream < ? extends Arguments > provideArguments ( ExtensionContext context )
throws Exception {
public Stream < ? extends Arguments > provideArguments ( ExtensionContext context ) {
return this . source . provideArguments ( context ) ;
}
@ -523,27 +608,25 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -523,27 +608,25 @@ class AutowiredInstantiationArgumentsResolverTests {
enum Sources {
SINGLE_ARG {
@Override
protected void setup ( ) {
add ( SingleArgConstructor . class , AutowiredInstantiationArgumentsResolv er
add ( SingleArgConstructor . class , BeanInstanceSuppli er
. forConstructor ( String . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
SingleArgFactory . class , "single" , String . class ) ) ;
}
} ,
INNER_CLASS_SINGLE_ARG {
@Override
protected void setup ( ) {
add ( Enclosing . InnerSingleArgConstructor . class ,
AutowiredInstantiationArgumentsResolv er
BeanInstanceSuppli er
. forConstructor ( String . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
Enclosing . InnerSingleArgFactory . class , "single" ,
String . class ) ) ;
}
@ -551,71 +634,66 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -551,71 +634,66 @@ class AutowiredInstantiationArgumentsResolverTests {
} ,
ARRAY_OF_BEANS {
@Override
protected void setup ( ) {
add ( BeansCollectionConstructor . class ,
AutowiredInstantiationArgumentsResolv er
BeanInstanceSuppli er
. forConstructor ( String [ ] . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
BeansCollectionFactory . class , "array" , String [ ] . class ) ) ;
}
} ,
LIST_OF_BEANS {
@Override
protected void setup ( ) {
add ( BeansCollectionConstructor . class ,
AutowiredInstantiationArgumentsResolv er
BeanInstanceSuppli er
. forConstructor ( List . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
BeansCollectionFactory . class , "list" , List . class ) ) ;
}
} ,
SET_OF_BEANS {
@Override
protected void setup ( ) {
add ( BeansCollectionConstructor . class ,
AutowiredInstantiationArgumentsResolv er
BeanInstanceSuppli er
. forConstructor ( Set . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
BeansCollectionFactory . class , "set" , Set . class ) ) ;
}
} ,
MAP_OF_BEANS {
@Override
protected void setup ( ) {
add ( BeansCollectionConstructor . class ,
AutowiredInstantiationArgumentsResolv er
BeanInstanceSuppli er
. forConstructor ( Map . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
BeansCollectionFactory . class , "map" , Map . class ) ) ;
}
} ,
MULTI_ARGS {
@Override
protected void setup ( ) {
add ( MultiArgsConstructor . class ,
AutowiredInstantiationArgumentsResolv er. forConstructor (
BeanInstanceSuppli er. forConstructor (
ResourceLoader . class , Environment . class ,
ObjectProvider . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
MultiArgsFactory . class , "multiArgs" , ResourceLoader . class ,
Environment . class , ObjectProvider . class ) ) ;
}
@ -623,14 +701,13 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -623,14 +701,13 @@ class AutowiredInstantiationArgumentsResolverTests {
} ,
MIXED_ARGS {
@Override
protected void setup ( ) {
add ( MixedArgsConstructor . class ,
AutowiredInstantiationArgumentsResolv er. forConstructor (
BeanInstanceSuppli er. forConstructor (
ResourceLoader . class , String . class , Environment . class ) ) ;
add ( String . class ,
AutowiredInstantiationArgumentsResolv er. forFactoryMethod (
BeanInstanceSuppli er. forFactoryMethod (
MixedArgsFactory . class , "mixedArgs" , ResourceLoader . class ,
String . class , Environment . class ) ) ;
}
@ -639,7 +716,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -639,7 +716,7 @@ class AutowiredInstantiationArgumentsResolverTests {
private final List < Arguments > arguments ;
private Sources ( ) {
Sources ( ) {
this . arguments = new ArrayList < > ( ) ;
setup ( ) ;
}
@ -647,7 +724,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -647,7 +724,7 @@ class AutowiredInstantiationArgumentsResolverTests {
protected abstract void setup ( ) ;
protected final void add ( Class < ? > beanClass ,
AutowiredInstantiationArgumentsResolv er resolver ) {
BeanInstanceSuppli er resolver ) {
this . arguments . add ( Arguments . of ( new Source ( beanClass , resolver ) ) ) ;
}
@ -657,16 +734,12 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -657,16 +734,12 @@ class AutowiredInstantiationArgumentsResolverTests {
}
static class Source {
private final Class < ? > beanClass ;
static class BeanRegistrar {
private final AutowiredInstantiationArgumentsResolver resolver ;
final Class < ? > beanClass ;
public Source ( Class < ? > beanClass ,
AutowiredInstantiationArgumentsResolver resolver ) {
public BeanRegistrar ( Class < ? > beanClass ) {
this . beanClass = beanClass ;
this . resolver = resolver ;
}
RegisteredBean registerBean ( DefaultListableBeanFactory beanFactory ) {
@ -685,8 +758,19 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -685,8 +758,19 @@ class AutowiredInstantiationArgumentsResolverTests {
beanFactory . registerBeanDefinition ( beanName , beanDefinition ) ;
return RegisteredBean . of ( beanFactory , beanName ) ;
}
}
static class Source extends BeanRegistrar {
private final BeanInstanceSupplier resolver ;
public Source ( Class < ? > beanClass ,
BeanInstanceSupplier resolver ) {
super ( beanClass ) ;
this . resolver = resolver ;
}
AutowiredInstantiationArgumentsResolver getResolver ( ) {
BeanInstanceSuppli er getResolver ( ) {
return this . resolver ;
}
@ -715,7 +799,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -715,7 +799,7 @@ class AutowiredInstantiationArgumentsResolverTests {
}
String getString ( ) {
return string ;
return this . string ;
}
}
@ -834,7 +918,7 @@ class AutowiredInstantiationArgumentsResolverTests {
@@ -834,7 +918,7 @@ class AutowiredInstantiationArgumentsResolverTests {
}
static interface MethodOnInterface {
interface MethodOnInterface {
default String test ( ) {
return "Test" ;