Simplify InstanceSupplierCodeGeneratorTests

This commit is contained in:
Stéphane Nicoll 2023-10-10 13:41:47 +02:00
parent 4b14a0b42c
commit 35372e5e72
1 changed files with 42 additions and 53 deletions

View File

@ -68,18 +68,20 @@ class InstanceSupplierCodeGeneratorTests {
private final TestGenerationContext generationContext; private final TestGenerationContext generationContext;
private final DefaultListableBeanFactory beanFactory;
InstanceSupplierCodeGeneratorTests() { InstanceSupplierCodeGeneratorTests() {
this.generationContext = new TestGenerationContext(); this.generationContext = new TestGenerationContext();
this.beanFactory = new DefaultListableBeanFactory();
} }
@Test @Test
void generateWhenHasDefaultConstructor() { void generateWhenHasDefaultConstructor() {
BeanDefinition beanDefinition = new RootBeanDefinition(TestBean.class); BeanDefinition beanDefinition = new RootBeanDefinition(TestBean.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { TestBean bean = getBean(beanDefinition, instanceSupplier);
TestBean bean = getBean(beanFactory, beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(TestBean.class); assertThat(bean).isInstanceOf(TestBean.class);
assertThat(compiled.getSourceFile()) assertThat(compiled.getSourceFile())
.contains("InstanceSupplier.using(TestBean::new)"); .contains("InstanceSupplier.using(TestBean::new)");
@ -91,11 +93,9 @@ class InstanceSupplierCodeGeneratorTests {
@Test @Test
void generateWhenHasConstructorWithParameter() { void generateWhenHasConstructorWithParameter() {
BeanDefinition beanDefinition = new RootBeanDefinition(InjectionComponent.class); BeanDefinition beanDefinition = new RootBeanDefinition(InjectionComponent.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerSingleton("injected", "injected");
beanFactory.registerSingleton("injected", "injected"); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { InjectionComponent bean = getBean(beanDefinition, instanceSupplier);
InjectionComponent bean = getBean(beanFactory, beanDefinition,
instanceSupplier);
assertThat(bean).isInstanceOf(InjectionComponent.class).extracting("bean") assertThat(bean).isInstanceOf(InjectionComponent.class).extracting("bean")
.isEqualTo("injected"); .isEqualTo("injected");
}); });
@ -107,10 +107,9 @@ class InstanceSupplierCodeGeneratorTests {
void generateWhenHasConstructorWithInnerClassAndDefaultConstructor() { void generateWhenHasConstructorWithInnerClassAndDefaultConstructor() {
RootBeanDefinition beanDefinition = new RootBeanDefinition( RootBeanDefinition beanDefinition = new RootBeanDefinition(
NoDependencyComponent.class); NoDependencyComponent.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerSingleton("configuration", new InnerComponentConfiguration());
beanFactory.registerSingleton("configuration", new InnerComponentConfiguration()); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { NoDependencyComponent bean = getBean(beanDefinition,
NoDependencyComponent bean = getBean(beanFactory, beanDefinition,
instanceSupplier); instanceSupplier);
assertThat(bean).isInstanceOf(NoDependencyComponent.class); assertThat(bean).isInstanceOf(NoDependencyComponent.class);
assertThat(compiled.getSourceFile()).contains( assertThat(compiled.getSourceFile()).contains(
@ -124,11 +123,10 @@ class InstanceSupplierCodeGeneratorTests {
void generateWhenHasConstructorWithInnerClassAndParameter() { void generateWhenHasConstructorWithInnerClassAndParameter() {
BeanDefinition beanDefinition = new RootBeanDefinition( BeanDefinition beanDefinition = new RootBeanDefinition(
EnvironmentAwareComponent.class); EnvironmentAwareComponent.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerSingleton("configuration", new InnerComponentConfiguration());
beanFactory.registerSingleton("configuration", new InnerComponentConfiguration()); this.beanFactory.registerSingleton("environment", new StandardEnvironment());
beanFactory.registerSingleton("environment", new StandardEnvironment()); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { EnvironmentAwareComponent bean = getBean(beanDefinition,
EnvironmentAwareComponent bean = getBean(beanFactory, beanDefinition,
instanceSupplier); instanceSupplier);
assertThat(bean).isInstanceOf(EnvironmentAwareComponent.class); assertThat(bean).isInstanceOf(EnvironmentAwareComponent.class);
assertThat(compiled.getSourceFile()).contains( assertThat(compiled.getSourceFile()).contains(
@ -142,10 +140,9 @@ class InstanceSupplierCodeGeneratorTests {
void generateWhenHasConstructorWithGeneric() { void generateWhenHasConstructorWithGeneric() {
BeanDefinition beanDefinition = new RootBeanDefinition( BeanDefinition beanDefinition = new RootBeanDefinition(
NumberHolderFactoryBean.class); NumberHolderFactoryBean.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerSingleton("number", 123);
beanFactory.registerSingleton("number", 123); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { NumberHolder<?> bean = getBean(beanDefinition, instanceSupplier);
NumberHolder<?> bean = getBean(beanFactory, beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(NumberHolder.class); assertThat(bean).isInstanceOf(NumberHolder.class);
assertThat(bean).extracting("number").isNull(); // No property actually set assertThat(bean).extracting("number").isNull(); // No property actually set
assertThat(compiled.getSourceFile()).contains("NumberHolderFactoryBean::new"); assertThat(compiled.getSourceFile()).contains("NumberHolderFactoryBean::new");
@ -158,9 +155,8 @@ class InstanceSupplierCodeGeneratorTests {
void generateWhenHasPrivateConstructor() { void generateWhenHasPrivateConstructor() {
BeanDefinition beanDefinition = new RootBeanDefinition( BeanDefinition beanDefinition = new RootBeanDefinition(
TestBeanWithPrivateConstructor.class); TestBeanWithPrivateConstructor.class);
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); compile(beanDefinition, (instanceSupplier, compiled) -> {
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { TestBeanWithPrivateConstructor bean = getBean(beanDefinition,
TestBeanWithPrivateConstructor bean = getBean(beanFactory, beanDefinition,
instanceSupplier); instanceSupplier);
assertThat(bean).isInstanceOf(TestBeanWithPrivateConstructor.class); assertThat(bean).isInstanceOf(TestBeanWithPrivateConstructor.class);
assertThat(compiled.getSourceFile()) assertThat(compiled.getSourceFile())
@ -175,11 +171,10 @@ class InstanceSupplierCodeGeneratorTests {
BeanDefinition beanDefinition = BeanDefinitionBuilder BeanDefinition beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(String.class) .rootBeanDefinition(String.class)
.setFactoryMethodOnBean("stringBean", "config").getBeanDefinition(); .setFactoryMethodOnBean("stringBean", "config").getBeanDefinition();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
.genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition()); .genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition());
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanDefinition, (instanceSupplier, compiled) -> {
String bean = getBean(beanFactory, beanDefinition, instanceSupplier); String bean = getBean(beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(String.class); assertThat(bean).isInstanceOf(String.class);
assertThat(bean).isEqualTo("Hello"); assertThat(bean).isEqualTo("Hello");
assertThat(compiled.getSourceFile()).contains( assertThat(compiled.getSourceFile()).contains(
@ -195,11 +190,10 @@ class InstanceSupplierCodeGeneratorTests {
.rootBeanDefinition(String.class) .rootBeanDefinition(String.class)
.setFactoryMethodOnBean("privateStaticStringBean", "config") .setFactoryMethodOnBean("privateStaticStringBean", "config")
.getBeanDefinition(); .getBeanDefinition();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
.genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition()); .genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition());
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanDefinition, (instanceSupplier, compiled) -> {
String bean = getBean(beanFactory, beanDefinition, instanceSupplier); String bean = getBean(beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(String.class); assertThat(bean).isInstanceOf(String.class);
assertThat(bean).isEqualTo("Hello"); assertThat(bean).isEqualTo("Hello");
assertThat(compiled.getSourceFile()) assertThat(compiled.getSourceFile())
@ -215,11 +209,10 @@ class InstanceSupplierCodeGeneratorTests {
BeanDefinition beanDefinition = BeanDefinitionBuilder BeanDefinition beanDefinition = BeanDefinitionBuilder
.rootBeanDefinition(Integer.class) .rootBeanDefinition(Integer.class)
.setFactoryMethodOnBean("integerBean", "config").getBeanDefinition(); .setFactoryMethodOnBean("integerBean", "config").getBeanDefinition();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
.genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition()); .genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition());
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanDefinition, (instanceSupplier, compiled) -> {
Integer bean = getBean(beanFactory, beanDefinition, instanceSupplier); Integer bean = getBean(beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(Integer.class); assertThat(bean).isInstanceOf(Integer.class);
assertThat(bean).isEqualTo(42); assertThat(bean).isEqualTo(42);
assertThat(compiled.getSourceFile()) assertThat(compiled.getSourceFile())
@ -236,13 +229,12 @@ class InstanceSupplierCodeGeneratorTests {
.setFactoryMethodOnBean("create", "config").getBeanDefinition(); .setFactoryMethodOnBean("create", "config").getBeanDefinition();
beanDefinition.setResolvedFactoryMethod(ReflectionUtils beanDefinition.setResolvedFactoryMethod(ReflectionUtils
.findMethod(SampleFactory.class, "create", Number.class, String.class)); .findMethod(SampleFactory.class, "create", Number.class, String.class));
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
.genericBeanDefinition(SampleFactory.class).getBeanDefinition()); .genericBeanDefinition(SampleFactory.class).getBeanDefinition());
beanFactory.registerSingleton("number", 42); this.beanFactory.registerSingleton("number", 42);
beanFactory.registerSingleton("string", "test"); this.beanFactory.registerSingleton("string", "test");
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanDefinition, (instanceSupplier, compiled) -> {
String bean = getBean(beanFactory, beanDefinition, instanceSupplier); String bean = getBean(beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(String.class); assertThat(bean).isInstanceOf(String.class);
assertThat(bean).isEqualTo("42test"); assertThat(bean).isEqualTo("42test");
assertThat(compiled.getSourceFile()).contains("SampleFactory.create("); assertThat(compiled.getSourceFile()).contains("SampleFactory.create(");
@ -257,11 +249,10 @@ class InstanceSupplierCodeGeneratorTests {
.rootBeanDefinition(Integer.class) .rootBeanDefinition(Integer.class)
.setFactoryMethodOnBean("throwingIntegerBean", "config") .setFactoryMethodOnBean("throwingIntegerBean", "config")
.getBeanDefinition(); .getBeanDefinition();
DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); this.beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
beanFactory.registerBeanDefinition("config", BeanDefinitionBuilder
.genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition()); .genericBeanDefinition(SimpleConfiguration.class).getBeanDefinition());
compile(beanFactory, beanDefinition, (instanceSupplier, compiled) -> { compile(beanDefinition, (instanceSupplier, compiled) -> {
Integer bean = getBean(beanFactory, beanDefinition, instanceSupplier); Integer bean = getBean(beanDefinition, instanceSupplier);
assertThat(bean).isInstanceOf(Integer.class); assertThat(bean).isInstanceOf(Integer.class);
assertThat(bean).isEqualTo(42); assertThat(bean).isEqualTo(42);
assertThat(compiled.getSourceFile()).doesNotContain(") throws Exception {"); assertThat(compiled.getSourceFile()).doesNotContain(") throws Exception {");
@ -287,17 +278,15 @@ class InstanceSupplierCodeGeneratorTests {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private <T> T getBean(DefaultListableBeanFactory beanFactory, private <T> T getBean(BeanDefinition beanDefinition, InstanceSupplier<?> instanceSupplier) {
BeanDefinition beanDefinition, InstanceSupplier<?> instanceSupplier) {
((RootBeanDefinition) beanDefinition).setInstanceSupplier(instanceSupplier); ((RootBeanDefinition) beanDefinition).setInstanceSupplier(instanceSupplier);
beanFactory.registerBeanDefinition("testBean", beanDefinition); this.beanFactory.registerBeanDefinition("testBean", beanDefinition);
return (T) beanFactory.getBean("testBean"); return (T) this.beanFactory.getBean("testBean");
} }
private void compile(DefaultListableBeanFactory beanFactory, BeanDefinition beanDefinition, private void compile(BeanDefinition beanDefinition, BiConsumer<InstanceSupplier<?>, Compiled> result) {
BiConsumer<InstanceSupplier<?>, Compiled> result) {
DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory(beanFactory); DefaultListableBeanFactory freshBeanFactory = new DefaultListableBeanFactory(this.beanFactory);
freshBeanFactory.registerBeanDefinition("testBean", beanDefinition); freshBeanFactory.registerBeanDefinition("testBean", beanDefinition);
RegisteredBean registeredBean = RegisteredBean.of(freshBeanFactory, "testBean"); RegisteredBean registeredBean = RegisteredBean.of(freshBeanFactory, "testBean");
DeferredTypeBuilder typeBuilder = new DeferredTypeBuilder(); DeferredTypeBuilder typeBuilder = new DeferredTypeBuilder();