Polish test utilities

This commit is contained in:
Stephane Nicoll
2019-09-26 17:36:53 +02:00
parent 952d30f9a9
commit 7da1db9329
5 changed files with 57 additions and 66 deletions

View File

@@ -46,8 +46,8 @@ class ProjectGeneratorIntegrationTests {
@BeforeEach
void setup(@TempDir Path directory) {
this.projectTester = new ProjectGeneratorTester().withDirectory(directory).withBean(InitializrMetadata.class,
() -> InitializrMetadataTestBuilder.withDefaults().build());
this.projectTester = new ProjectGeneratorTester().withDirectory(directory).withIndentingWriterFactory()
.withBean(InitializrMetadata.class, () -> InitializrMetadataTestBuilder.withDefaults().build());
}
@Test

View File

@@ -19,11 +19,14 @@ package io.spring.initializr.generator.test.project;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.io.SimpleIndentStrategy;
import io.spring.initializr.generator.project.MutableProjectDescription;
import io.spring.initializr.generator.project.ProjectDirectoryFactory;
import io.spring.initializr.generator.project.ProjectGenerationContext;
@@ -43,10 +46,6 @@ public abstract class AbstractProjectGenerationTester<SELF extends AbstractProje
private final Consumer<MutableProjectDescription> descriptionCustomizer;
protected AbstractProjectGenerationTester(Map<Class<?>, Supplier<?>> beanDefinitions) {
this(beanDefinitions, defaultContextInitializer(), defaultDescriptionCustomizer());
}
protected AbstractProjectGenerationTester(Map<Class<?>, Supplier<?>> beanDefinitions,
Consumer<ProjectGenerationContext> contextInitializer,
Consumer<MutableProjectDescription> descriptionCustomizer) {
@@ -55,6 +54,32 @@ public abstract class AbstractProjectGenerationTester<SELF extends AbstractProje
this.contextInitializer = contextInitializer;
}
protected AbstractProjectGenerationTester() {
this(Collections.emptyMap(), emptyContextInitializer(), defaultDescriptionCustomizer());
}
private static Consumer<ProjectGenerationContext> emptyContextInitializer() {
return (context) -> {
};
}
private static Consumer<MutableProjectDescription> defaultDescriptionCustomizer() {
return (projectDescription) -> {
if (projectDescription.getGroupId() == null) {
projectDescription.setGroupId("com.example");
}
if (projectDescription.getArtifactId() == null) {
projectDescription.setArtifactId("demo");
}
if (projectDescription.getVersion() == null) {
projectDescription.setVersion("0.0.1-SNAPSHOT");
}
if (projectDescription.getApplicationName() == null) {
projectDescription.setApplicationName("DemoApplication");
}
};
}
protected abstract SELF newInstance(Map<Class<?>, Supplier<?>> beanDefinitions,
Consumer<ProjectGenerationContext> contextInitializer,
Consumer<MutableProjectDescription> descriptionCustomizer);
@@ -70,6 +95,15 @@ public abstract class AbstractProjectGenerationTester<SELF extends AbstractProje
() -> (description) -> Files.createTempDirectory(directory, "project-"));
}
public SELF withIndentingWriterFactory() {
return withBean(IndentingWriterFactory.class,
() -> IndentingWriterFactory.create(new SimpleIndentStrategy(" ")));
}
public SELF withConfiguration(Class<?>... configurationClasses) {
return withContextInitializer((context) -> context.register(configurationClasses));
}
public SELF withContextInitializer(Consumer<ProjectGenerationContext> context) {
return newInstance(this.beanDefinitions, this.contextInitializer.andThen(context), this.descriptionCustomizer);
}
@@ -79,28 +113,6 @@ public abstract class AbstractProjectGenerationTester<SELF extends AbstractProje
this.descriptionCustomizer.andThen(description));
}
protected static Consumer<ProjectGenerationContext> defaultContextInitializer() {
return (context) -> {
};
}
protected static Consumer<MutableProjectDescription> defaultDescriptionCustomizer() {
return (projectDescription) -> {
if (projectDescription.getGroupId() == null) {
projectDescription.setGroupId("com.example");
}
if (projectDescription.getArtifactId() == null) {
projectDescription.setArtifactId("demo");
}
if (projectDescription.getVersion() == null) {
projectDescription.setVersion("0.0.1-SNAPSHOT");
}
if (projectDescription.getApplicationName() == null) {
projectDescription.setApplicationName("DemoApplication");
}
};
}
protected <T> T invokeProjectGeneration(MutableProjectDescription description,
ProjectGenerationInvoker<T> invoker) {
this.descriptionCustomizer.accept(description);

View File

@@ -17,15 +17,12 @@
package io.spring.initializr.generator.test.project;
import java.nio.file.Path;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.io.SimpleIndentStrategy;
import io.spring.initializr.generator.project.MutableProjectDescription;
import io.spring.initializr.generator.project.ProjectAssetGenerator;
import io.spring.initializr.generator.project.ProjectDescription;
@@ -40,20 +37,21 @@ import org.springframework.boot.test.context.runner.ContextConsumer;
/**
* A tester for project asset that does not detect available {@link ProjectContributor
* contributors} and does not register any bean to the context. Contributors can be added
* using a {@link #withConfiguration(Class[]) configuration class} or a
* {@link #withContextInitializer(Consumer) customization of the project generation
* using {@linkplain #withBean(Class, Supplier) bean registration}, a
* {@linkplain #withConfiguration(Class[]) configuration class} or via the
* {@linkplain #withContextInitializer(Consumer) customization of the project generation
* context}.
* <p>
* Alternatively, the context can be queried the same way {@link ApplicationContextRunner}
* works by {@link #configure(MutableProjectDescription, ContextConsumer) configuring} the
* context.
* works by {@linkplain #configure(MutableProjectDescription, ContextConsumer)
* configuring} the context.
*
* @author Stephane Nicoll
*/
public class ProjectAssetTester extends AbstractProjectGenerationTester<ProjectAssetTester> {
public ProjectAssetTester() {
super(Collections.emptyMap());
super();
}
private ProjectAssetTester(Map<Class<?>, Supplier<?>> beanDefinitions,
@@ -69,15 +67,6 @@ public class ProjectAssetTester extends AbstractProjectGenerationTester<ProjectA
return new ProjectAssetTester(beanDefinitions, contextInitializer, descriptionCustomizer);
}
public ProjectAssetTester withIndentingWriterFactory() {
return withBean(IndentingWriterFactory.class,
() -> IndentingWriterFactory.create(new SimpleIndentStrategy(" ")));
}
public ProjectAssetTester withConfiguration(Class<?>... configurationClasses) {
return withContextInitializer((context) -> context.register(configurationClasses));
}
/**
* Configure a {@link ProjectGenerationContext} using the specified
* {@code description} and use the {@link ContextConsumer} to assert the context.

View File

@@ -17,42 +17,39 @@
package io.spring.initializr.generator.test.project;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Supplier;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.io.SimpleIndentStrategy;
import io.spring.initializr.generator.project.DefaultProjectAssetGenerator;
import io.spring.initializr.generator.project.MutableProjectDescription;
import io.spring.initializr.generator.project.ProjectAssetGenerator;
import io.spring.initializr.generator.project.ProjectGenerationConfiguration;
import io.spring.initializr.generator.project.ProjectGenerationContext;
import io.spring.initializr.generator.project.ProjectGenerator;
/**
* A tester class for {@link ProjectGenerator}.
* A tester class for {@link ProjectGenerator}. Contrary to {@link ProjectAssetTester},
* standard {@link ProjectGenerationConfiguration} classes are processed
* automatically.Extra beans can be added using {@linkplain #withBean(Class, Supplier)
* bean registration}, a {@linkplain #withConfiguration(Class[]) configuration class} or
* via the {@linkplain #withContextInitializer(Consumer) customization of the project
* generation context}.
*
* @author Stephane Nicoll
*/
public class ProjectGeneratorTester extends AbstractProjectGenerationTester<ProjectGeneratorTester> {
public ProjectGeneratorTester() {
super();
}
private ProjectGeneratorTester(Map<Class<?>, Supplier<?>> beanDefinitions,
Consumer<ProjectGenerationContext> contextInitializer,
Consumer<MutableProjectDescription> descriptionCustomizer) {
super(beanDefinitions, contextInitializer, descriptionCustomizer);
}
public ProjectGeneratorTester() {
super(defaultBeans());
}
private static Map<Class<?>, Supplier<?>> defaultBeans() {
Map<Class<?>, Supplier<?>> beans = new HashMap<>();
beans.put(IndentingWriterFactory.class, () -> IndentingWriterFactory.create(new SimpleIndentStrategy(" ")));
return beans;
}
@Override
protected ProjectGeneratorTester newInstance(Map<Class<?>, Supplier<?>> beanDefinitions,
Consumer<ProjectGenerationContext> contextInitializer,

View File

@@ -20,7 +20,6 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Map;
import io.spring.initializr.generator.io.IndentingWriterFactory;
import io.spring.initializr.generator.project.MutableProjectDescription;
import io.spring.initializr.generator.project.ProjectDescription;
import io.spring.initializr.generator.project.contributor.ProjectContributor;
@@ -45,12 +44,6 @@ class ProjectGeneratorTesterTests {
assertThat(contributors).isEmpty();
}
@Test
void testerHasIndentingWriterFactoryByDefault() {
new ProjectGeneratorTester().generate(new MutableProjectDescription(),
(context) -> assertThat(context.getBeansOfType(IndentingWriterFactory.class)).hasSize(1));
}
@Test
void testerWithDescriptionCustomizer() {
Version platformVersion = Version.parse("2.1.0.RELEASE");