Introduce TestGenerationContext

This commit polishes DefaultGenerationContext to make the method
that flushes generated classes more explicit. It now throws an
IOException and TestGenerationContext has been updated to handle
that to ease its use in code that can't throw such an exception.

As this use case is likely to happen outside the Spring Framework,
this commit adds such a convenience to spring-test as well.

Closes gh-28877
This commit is contained in:
Stephane Nicoll
2022-07-26 15:58:28 +02:00
parent 60d2d16b2b
commit 3d5003ad63
18 changed files with 144 additions and 100 deletions

View File

@@ -23,8 +23,6 @@ import javax.lang.model.element.Modifier;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.generate.MethodReference;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import org.springframework.aot.test.generator.compile.CompileWithTargetClassAccess;
@@ -53,9 +51,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class AutowiredAnnotationBeanRegistrationAotContributionTests {
private final InMemoryGeneratedFiles generatedFiles;
private final DefaultGenerationContext generationContext;
private final TestGenerationContext generationContext;
private final MockBeanRegistrationCode beanRegistrationCode;
@@ -63,8 +59,7 @@ class AutowiredAnnotationBeanRegistrationAotContributionTests {
AutowiredAnnotationBeanRegistrationAotContributionTests() {
this.generatedFiles = new InMemoryGeneratedFiles();
this.generationContext = new TestGenerationContext(this.generatedFiles);
this.generationContext = new TestGenerationContext();
this.beanRegistrationCode = new MockBeanRegistrationCode(this.generationContext);
this.beanFactory = new DefaultListableBeanFactory();
}
@@ -177,7 +172,7 @@ class AutowiredAnnotationBeanRegistrationAotContributionTests {
});
this.generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(this.generatedFiles).compile(compiled ->
TestCompiler.forSystem().withFiles(this.generationContext.getGeneratedFiles()).compile(compiled ->
result.accept(compiled.getInstance(BiFunction.class), compiled));
}

View File

@@ -27,10 +27,8 @@ import javax.lang.model.element.Modifier;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedMethod;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.generate.MethodReference;
import org.springframework.aot.test.generator.compile.CompileWithTargetClassAccess;
import org.springframework.aot.test.generator.compile.Compiled;
@@ -64,9 +62,7 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class BeanDefinitionMethodGeneratorTests {
private final InMemoryGeneratedFiles generatedFiles;
private final DefaultGenerationContext generationContext;
private final TestGenerationContext generationContext;
private final DefaultListableBeanFactory beanFactory;
@@ -76,8 +72,7 @@ class BeanDefinitionMethodGeneratorTests {
BeanDefinitionMethodGeneratorTests() {
this.generatedFiles = new InMemoryGeneratedFiles();
this.generationContext = new TestGenerationContext(this.generatedFiles);
this.generationContext = new TestGenerationContext();
this.beanFactory = new DefaultListableBeanFactory();
this.methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory(
new AotFactoriesLoader(this.beanFactory, new MockSpringFactoriesLoader()));
@@ -412,7 +407,7 @@ class BeanDefinitionMethodGeneratorTests {
.addCode("return $L;", method.toInvokeCodeBlock()).build());
});
this.generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(this.generatedFiles).printFiles(System.out).compile(compiled ->
TestCompiler.forSystem().withFiles(this.generationContext.getGeneratedFiles()).compile(compiled ->
result.accept((RootBeanDefinition) compiled.getInstance(Supplier.class).get(), compiled));
}

View File

@@ -27,9 +27,7 @@ import javax.lang.model.element.Modifier;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedClass;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.hint.predicate.RuntimeHintsPredicates;
import org.springframework.aot.test.generator.compile.Compiled;
import org.springframework.aot.test.generator.compile.TestCompiler;
@@ -63,9 +61,7 @@ class BeanDefinitionPropertiesCodeGeneratorTests {
private final RootBeanDefinition beanDefinition = new RootBeanDefinition();
private final InMemoryGeneratedFiles generatedFiles = new InMemoryGeneratedFiles();
private final DefaultGenerationContext generationContext = new TestGenerationContext(this.generatedFiles);
private final TestGenerationContext generationContext = new TestGenerationContext();
@Test
void setPrimaryWhenFalse() {
@@ -434,7 +430,7 @@ class BeanDefinitionPropertiesCodeGeneratorTests {
.addStatement("return beanDefinition").build());
});
this.generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(this.generatedFiles).compile(compiled -> {
TestCompiler.forSystem().withFiles(this.generationContext.getGeneratedFiles()).compile(compiled -> {
RootBeanDefinition suppliedBeanDefinition = (RootBeanDefinition) compiled
.getInstance(Supplier.class).get();
result.accept(suppliedBeanDefinition, compiled);

View File

@@ -33,9 +33,7 @@ import javax.lang.model.element.Modifier;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedClass;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.test.generator.compile.Compiled;
import org.springframework.aot.test.generator.compile.TestCompiler;
import org.springframework.beans.factory.config.BeanReference;
@@ -64,8 +62,7 @@ import static org.assertj.core.api.Assertions.assertThat;
class BeanDefinitionPropertyValueCodeGeneratorTests {
private void compile(Object value, BiConsumer<Object, Compiled> result) {
InMemoryGeneratedFiles generatedFiles = new InMemoryGeneratedFiles();
DefaultGenerationContext generationContext = new TestGenerationContext(generatedFiles);
TestGenerationContext generationContext = new TestGenerationContext();
DeferredTypeBuilder typeBuilder = new DeferredTypeBuilder();
GeneratedClass generatedClass = generationContext.getGeneratedClasses().addForFeature("TestCode", typeBuilder);
CodeBlock generatedCode = new BeanDefinitionPropertyValueCodeGenerator(
@@ -78,7 +75,7 @@ class BeanDefinitionPropertyValueCodeGeneratorTests {
.returns(Object.class).addStatement("return $L", generatedCode).build());
});
generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(generatedFiles).compile(compiled ->
TestCompiler.forSystem().withFiles(generationContext.getGeneratedFiles()).compile(compiled ->
result.accept(compiled.getInstance(Supplier.class).get(), compiled));
}
@@ -468,7 +465,7 @@ class BeanDefinitionPropertyValueCodeGeneratorTests {
@Test
void generatedWhenBeanNameReference() {
RuntimeBeanNameReference beanReference = new RuntimeBeanNameReference("test");
compile(beanReference, (instance, compiler) -> {
compile(beanReference, (instance, compiler) -> {
RuntimeBeanReference actual = (RuntimeBeanReference) instance;
assertThat(actual.getBeanName()).isEqualTo(beanReference.getBeanName());
});
@@ -477,7 +474,7 @@ class BeanDefinitionPropertyValueCodeGeneratorTests {
@Test
void generatedWhenBeanReferenceByName() {
RuntimeBeanReference beanReference = new RuntimeBeanReference("test");
compile(beanReference, (instance, compiler) -> {
compile(beanReference, (instance, compiler) -> {
RuntimeBeanReference actual = (RuntimeBeanReference) instance;
assertThat(actual.getBeanName()).isEqualTo(beanReference.getBeanName());
assertThat(actual.getBeanType()).isEqualTo(beanReference.getBeanType());

View File

@@ -29,9 +29,7 @@ import javax.lang.model.element.Modifier;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.ClassNameGenerator;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.generate.MethodReference;
import org.springframework.aot.test.generator.compile.Compiled;
import org.springframework.aot.test.generator.compile.TestCompiler;
@@ -61,9 +59,7 @@ class BeanRegistrationsAotContributionTests {
private DefaultListableBeanFactory beanFactory;
private final InMemoryGeneratedFiles generatedFiles;
private DefaultGenerationContext generationContext;
private TestGenerationContext generationContext;
private final BeanDefinitionMethodGeneratorFactory methodGeneratorFactory;
@@ -73,8 +69,7 @@ class BeanRegistrationsAotContributionTests {
BeanRegistrationsAotContributionTests() {
this.springFactoriesLoader = new MockSpringFactoriesLoader();
this.beanFactory = new DefaultListableBeanFactory();
this.generatedFiles = new InMemoryGeneratedFiles();
this.generationContext = new TestGenerationContext(this.generatedFiles);
this.generationContext = new TestGenerationContext();
this.methodGeneratorFactory = new BeanDefinitionMethodGeneratorFactory(
new AotFactoriesLoader(this.beanFactory, this.springFactoriesLoader));
this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext);
@@ -102,8 +97,8 @@ class BeanRegistrationsAotContributionTests {
@Test
void applyToWhenHasNameGeneratesPrefixedFeatureName() {
this.generationContext = new DefaultGenerationContext(
new ClassNameGenerator(TestTarget.class, "Management"), this.generatedFiles);
this.generationContext = new TestGenerationContext(
new ClassNameGenerator(TestTarget.class, "Management"));
this.beanFactoryInitializationCode = new MockBeanFactoryInitializationCode(this.generationContext);
Map<String, BeanDefinitionMethodGenerator> registrations = new LinkedHashMap<>();
RegisteredBean registeredBean = registerBean(
@@ -170,7 +165,7 @@ class BeanRegistrationsAotContributionTests {
.build());
});
this.generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(this.generatedFiles).printFiles(System.out).compile(compiled ->
TestCompiler.forSystem().withFiles(this.generationContext.getGeneratedFiles()).compile(compiled ->
result.accept(compiled.getInstance(Consumer.class), compiled));
}

View File

@@ -25,9 +25,7 @@ import javax.lang.model.element.Modifier;
import org.assertj.core.api.ThrowingConsumer;
import org.junit.jupiter.api.Test;
import org.springframework.aot.generate.DefaultGenerationContext;
import org.springframework.aot.generate.GeneratedClass;
import org.springframework.aot.generate.InMemoryGeneratedFiles;
import org.springframework.aot.hint.ExecutableHint;
import org.springframework.aot.hint.ExecutableMode;
import org.springframework.aot.hint.ReflectionHints;
@@ -68,14 +66,11 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
class InstanceSupplierCodeGeneratorTests {
private final InMemoryGeneratedFiles generatedFiles;
private final DefaultGenerationContext generationContext;
private final TestGenerationContext generationContext;
InstanceSupplierCodeGeneratorTests() {
this.generatedFiles = new InMemoryGeneratedFiles();
this.generationContext = new TestGenerationContext(this.generatedFiles);
this.generationContext = new TestGenerationContext();
}
@@ -323,8 +318,8 @@ class InstanceSupplierCodeGeneratorTests {
.addStatement("return $L", generatedCode).build());
});
this.generationContext.writeGeneratedContent();
TestCompiler.forSystem().withFiles(this.generatedFiles).printFiles(System.out).compile(compiled ->
result.accept((InstanceSupplier<?>) compiled.getInstance(Supplier.class).get(), compiled));
TestCompiler.forSystem().withFiles(this.generationContext.getGeneratedFiles()).compile(compiled ->
result.accept((InstanceSupplier<?>) compiled.getInstance(Supplier.class).get(), compiled));
}
}