diff --git a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListener.java b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListener.java index 55d8a3555c..a9c93776b4 100644 --- a/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListener.java +++ b/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListener.java @@ -44,13 +44,22 @@ public class SpringBootDependencyInjectionTestExecutionListener super.prepareTestInstance(testContext); } catch (Exception ex) { + outputConditionEvaluationReport(testContext); + throw ex; + } + } + + private void outputConditionEvaluationReport(TestContext testContext) { + try { ApplicationContext context = testContext.getApplicationContext(); if (context instanceof ConfigurableApplicationContext) { ConditionEvaluationReport report = ConditionEvaluationReport .get(((ConfigurableApplicationContext) context).getBeanFactory()); System.err.println(new ConditionEvaluationReportMessage(report)); } - throw ex; + } + catch (Exception ex) { + // Allow original failure to be reported } } diff --git a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListenerTests.java b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListenerTests.java index edb70bf96a..66529936db 100644 --- a/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListenerTests.java +++ b/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/SpringBootDependencyInjectionTestExecutionListenerTests.java @@ -18,6 +18,7 @@ package org.springframework.boot.test.autoconfigure; import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.springframework.boot.SpringApplication; import org.springframework.boot.WebApplicationType; @@ -31,6 +32,7 @@ import org.springframework.test.context.TestContext; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import static org.assertj.core.api.Assertions.assertThat; +import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.containsString; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.mock; @@ -45,6 +47,9 @@ public class SpringBootDependencyInjectionTestExecutionListenerTests { @Rule public OutputCapture out = new OutputCapture(); + @Rule + public ExpectedException thrown = ExpectedException.none(); + private SpringBootDependencyInjectionTestExecutionListener reportListener = new SpringBootDependencyInjectionTestExecutionListener(); @Test @@ -74,6 +79,18 @@ public class SpringBootDependencyInjectionTestExecutionListenerTests { this.out.expect(containsString("Negative matches")); } + @Test + public void originalFailureIsThrownWhenReportGenerationFails() throws Exception { + TestContext testContext = mock(TestContext.class); + IllegalStateException originalFailure = new IllegalStateException(); + given(testContext.getTestInstance()).willThrow(originalFailure); + SpringApplication application = new SpringApplication(Config.class); + application.setWebEnvironment(false); + given(testContext.getApplicationContext()).willThrow(new RuntimeException()); + this.thrown.expect(is(originalFailure)); + this.reportListener.prepareTestInstance(testContext); + } + @Configuration @ImportAutoConfiguration(JacksonAutoConfiguration.class) static class Config {