diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java index 567960a5161..e149fd66ac8 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunner.java @@ -196,9 +196,8 @@ public abstract class AbstractApplicationContextRunner consumer) { - this.systemProperties.applyToSystemProperties(() -> { - try (A context = createAssertableContext()) { - accept(consumer, context); - } - return null; + withContextClassLoader(this.classLoader, () -> { + this.systemProperties.applyToSystemProperties(() -> { + try (A context = createAssertableContext()) { + accept(consumer, context); + } + return null; + }); }); return (SELF) this; } + private void withContextClassLoader(ClassLoader classLoader, Runnable action) { + if (classLoader == null) { + action.run(); + } + else { + Thread currentThread = Thread.currentThread(); + ClassLoader previous = currentThread.getContextClassLoader(); + currentThread.setContextClassLoader(classLoader); + try { + action.run(); + } + finally { + currentThread.setContextClassLoader(previous); + } + } + } + @SuppressWarnings("unchecked") private A createAssertableContext() { ResolvableType resolvableType = ResolvableType diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java index 24ec3c8c7c0..0af53a03bb9 100644 --- a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/context/runner/AbstractApplicationContextRunnerTests.java @@ -30,8 +30,12 @@ import org.springframework.boot.test.context.FilteredClassLoader; import org.springframework.boot.test.context.assertj.ApplicationContextAssertProvider; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Condition; +import org.springframework.context.annotation.ConditionContext; +import org.springframework.context.annotation.Conditional; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.util.ClassUtils; import static org.assertj.core.api.Assertions.assertThat; @@ -150,7 +154,7 @@ public abstract class AbstractApplicationContextRunnerTests { try { @@ -164,6 +168,14 @@ public abstract class AbstractApplicationContextRunnerTests assertThat(context) + .hasSingleBean(ConditionalConfig.class)); + } + @Test public void thrownRuleWorksWithCheckedException() { get().run((context) -> { @@ -209,4 +221,19 @@ public abstract class AbstractApplicationContextRunnerTests