From 01dfb82c246973e3f2dbbc67dc45a89fd2b7854f Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 24 Feb 2025 22:05:59 +0100 Subject: [PATCH] GH-1091 - ModuleTestExecution now uses ApplicationModulesFactory to bootstrap ApplicationModules. This allows running tests against it and see application modules located in test sources. --- .../test/ModuleContextCustomizerFactory.java | 9 +++++++++ .../modulith/test/ModuleTestExecution.java | 13 ++++++++++++- .../test/ModuleContextCustomizerUnitTests.java | 16 ++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleContextCustomizerFactory.java b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleContextCustomizerFactory.java index 43cb677f..accf28ca 100644 --- a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleContextCustomizerFactory.java +++ b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleContextCustomizerFactory.java @@ -92,6 +92,15 @@ class ModuleContextCustomizerFactory implements ContextCustomizerFactory { context.addApplicationListener(events); } + /** + * Returns the underlying initialized {@link ModuleTestExecution}. + * + * @return will never be {@literal null}. + */ + ModuleTestExecution getExecution() { + return execution.get(); + } + private static void logModules(ModuleTestExecution execution) { var module = execution.getModule(); diff --git a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java index 3a61fc82..828f7f9c 100644 --- a/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java +++ b/spring-modulith-test/src/main/java/org/springframework/modulith/test/ModuleTestExecution.java @@ -31,8 +31,10 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.test.context.AnnotatedClassFinder; import org.springframework.core.annotation.AnnotatedElementUtils; +import org.springframework.core.io.support.SpringFactoriesLoader; import org.springframework.modulith.core.ApplicationModule; import org.springframework.modulith.core.ApplicationModules; +import org.springframework.modulith.core.ApplicationModulesFactory; import org.springframework.modulith.core.JavaPackage; import org.springframework.modulith.test.ApplicationModuleTest.BootstrapMode; import org.springframework.util.ObjectUtils; @@ -46,10 +48,19 @@ import org.springframework.util.function.SingletonSupplier; public class ModuleTestExecution implements Iterable { private static final Logger LOGGER = LoggerFactory.getLogger(ModuleTestExecution.class); + private static final ApplicationModulesFactory BOOTSTRAP; private static Map, Class> MODULITH_TYPES = new HashMap<>(); private static Map EXECUTIONS = new HashMap<>(); + static { + + var factories = SpringFactoriesLoader.loadFactories(ApplicationModulesFactory.class, + ModuleTestExecution.class.getClassLoader()); + + BOOTSTRAP = !factories.isEmpty() ? factories.get(0) : ApplicationModulesFactory.defaultFactory(); + } + private final Key key; private final BootstrapMode bootstrapMode; @@ -98,7 +109,7 @@ public class ModuleTestExecution implements Iterable { var annotation = AnnotatedElementUtils.findMergedAnnotation(type, ApplicationModuleTest.class); var packageName = type.getPackage().getName(); - var modules = ApplicationModules.of(findSpringBootApplicationByClasses(annotation, type)); + var modules = BOOTSTRAP.of(findSpringBootApplicationByClasses(annotation, type)); var moduleName = annotation.module(); var module = StringUtils.hasText(moduleName) diff --git a/spring-modulith-test/src/test/java/org/springframework/modulith/test/ModuleContextCustomizerUnitTests.java b/spring-modulith-test/src/test/java/org/springframework/modulith/test/ModuleContextCustomizerUnitTests.java index 38cc5bd7..e7fc068f 100644 --- a/spring-modulith-test/src/test/java/org/springframework/modulith/test/ModuleContextCustomizerUnitTests.java +++ b/spring-modulith-test/src/test/java/org/springframework/modulith/test/ModuleContextCustomizerUnitTests.java @@ -17,7 +17,11 @@ package org.springframework.modulith.test; import static org.assertj.core.api.Assertions.*; +import example.module.SampleTestA; + import org.junit.jupiter.api.Test; +import org.springframework.modulith.core.ApplicationModule; +import org.springframework.modulith.core.ApplicationModuleIdentifier; import org.springframework.modulith.test.ModuleContextCustomizerFactory.ModuleContextCustomizer; /** @@ -37,4 +41,16 @@ class ModuleContextCustomizerUnitTests { assertThat(right).isEqualTo(left); assertThat(left).hasSameHashCodeAs(right); } + + @Test // GH-1090 + void usesTestClassIfConfigured() { + + var customizer = new ModuleContextCustomizer(SampleTestA.class); + var execution = customizer.getExecution(); + + assertThat(execution.getModule()) + .extracting(ApplicationModule::getIdentifier) + .extracting(ApplicationModuleIdentifier::toString) + .isEqualTo("module"); + } }