GH-1091 - ModuleTestExecution now uses ApplicationModulesFactory to bootstrap ApplicationModules.

This allows running tests against it and see application modules located in test sources.
This commit is contained in:
Oliver Drotbohm
2025-02-24 22:05:59 +01:00
parent e3aa897309
commit 01dfb82c24
3 changed files with 37 additions and 1 deletions

View File

@@ -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();

View File

@@ -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<ApplicationModule> {
private static final Logger LOGGER = LoggerFactory.getLogger(ModuleTestExecution.class);
private static final ApplicationModulesFactory BOOTSTRAP;
private static Map<Class<?>, Class<?>> MODULITH_TYPES = new HashMap<>();
private static Map<Key, ModuleTestExecution> 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<ApplicationModule> {
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)

View File

@@ -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");
}
}