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 90d186d325..2a616a2a95 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 @@ -1,5 +1,5 @@ /* - * Copyright 2012-2016 the original author or authors. + * Copyright 2012-2017 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,20 +44,25 @@ public class SpringBootDependencyInjectionTestExecutionListener super.prepareTestInstance(testContext); } catch (Exception ex) { - try { - ApplicationContext context = testContext.getApplicationContext(); - if (context instanceof ConfigurableApplicationContext) { - ConditionEvaluationReport report = ConditionEvaluationReport - .get(((ConfigurableApplicationContext) context).getBeanFactory()); - System.err.println(new ConditionEvaluationReportMessage(report)); - } - } - catch (Exception ignore) { - } + 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)); + } + } + catch (Exception ex) { + // Allow original failure to be reported + } + } + static class PostProcessor implements DefaultTestExecutionListenersPostProcessor { @Override 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 db0df23ced..408e58718d 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.autoconfigure.ImportAutoConfiguration; @@ -30,6 +31,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; @@ -44,6 +46,9 @@ public class SpringBootDependencyInjectionTestExecutionListenerTests { @Rule public OutputCapture out = new OutputCapture(); + @Rule + public ExpectedException thrown = ExpectedException.none(); + private SpringBootDependencyInjectionTestExecutionListener reportListener = new SpringBootDependencyInjectionTestExecutionListener(); @Test @@ -73,6 +78,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 {