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