Split up JUnit 5 OutputCapture class

Split the JUnit 5 `OutputCapture` class into separate `OutputExtension`
and `CapturedOutput` classes. The JUnit 5 callback methods are now
contained only in the `OutputExtension` class so no longer pollute the
public API that users will interact with.

The `CapturedOutput` class has also been updated to capture System.err
and System.out separately to allow distinct assertions if required.

Closes gh-17029
This commit is contained in:
Phillip Webb
2019-05-30 21:51:07 -07:00
parent 68a3fbd7a0
commit d11d5ceb29
49 changed files with 761 additions and 313 deletions

View File

@@ -24,7 +24,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.testsupport.BuildOutput;
import static org.assertj.core.api.Assertions.assertThat;
@@ -38,7 +39,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class FreeMarkerAutoConfigurationTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private final BuildOutput buildOutput = new BuildOutput(getClass());

View File

@@ -27,7 +27,8 @@ import retrofit2.Retrofit;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.test.util.ReflectionTestUtils;
@@ -44,7 +45,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class InfluxDbAutoConfigurationTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(InfluxDbAutoConfiguration.class));

View File

@@ -36,7 +36,8 @@ import org.springframework.boot.autoconfigure.jersey.JerseyAutoConfigurationServ
import org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -53,11 +54,11 @@ import static org.assertj.core.api.Assertions.assertThat;
*/
@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT)
@DirtiesContext
@ExtendWith(OutputCapture.class)
@ExtendWith(OutputExtension.class)
public class JerseyAutoConfigurationServletContainerTests {
@Test
public void existingJerseyServletIsAmended(OutputCapture output) {
public void existingJerseyServletIsAmended(CapturedOutput output) {
assertThat(output)
.contains("Configuring existing registration for Jersey servlet");
assertThat(output).contains(

View File

@@ -43,7 +43,8 @@ import org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationList
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.testsupport.Assume;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -63,7 +64,7 @@ import static org.assertj.core.api.Assertions.contentOf;
* @author Stephane Nicoll
* @author Dominic Gunn
*/
@ExtendWith(OutputCapture.class)
@ExtendWith(OutputExtension.class)
public class LiquibaseAutoConfigurationTests {
@BeforeEach
@@ -254,7 +255,7 @@ public class LiquibaseAutoConfigurationTests {
}
@Test
public void logging(OutputCapture output) {
public void logging(CapturedOutput output) {
this.contextRunner.withUserConfiguration(EmbeddedDataSourceConfiguration.class)
.run(assertLiquibase((liquibase) -> {
Object log = ReflectionTestUtils.getField(liquibase, "log");

View File

@@ -32,7 +32,8 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConf
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.context.event.ApplicationFailedEvent;
import org.springframework.boot.logging.LogLevel;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
@@ -55,7 +56,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException
public class ConditionEvaluationReportLoggingListenerTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private ConditionEvaluationReportLoggingListener initializer = new ConditionEvaluationReportLoggingListener();

View File

@@ -45,7 +45,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerA
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@@ -70,7 +71,7 @@ import static org.mockito.Mockito.verifyZeroInteractions;
public class QuartzAutoConfigurationTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
.withPropertyValues("spring.datasource.generate-unique-name=true")

View File

@@ -30,7 +30,8 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.test.City;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean;
import org.springframework.boot.web.servlet.filter.OrderedFilter;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@@ -65,7 +66,7 @@ public class SecurityAutoConfigurationTests {
PropertyPlaceholderAutoConfiguration.class));
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
@Test
public void testWebConfiguration() {

View File

@@ -30,7 +30,8 @@ import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConf
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.test.util.TestPropertyValues;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
@@ -53,7 +54,7 @@ import org.springframework.web.bind.annotation.RestController;
public class SecurityFilterAutoConfigurationEarlyInitializationTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
@Test
public void testSecurityFilterDoesNotCauseEarlyInitialization() {

View File

@@ -25,7 +25,8 @@ import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.security.SecurityProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@@ -58,7 +59,7 @@ public class UserDetailsServiceAutoConfigurationTests {
AutoConfigurations.of(UserDetailsServiceAutoConfiguration.class));
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
@Test
public void testDefaultUsernamePassword() {

View File

@@ -29,7 +29,8 @@ import org.springframework.boot.task.TaskExecutorCustomizer;
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.SyncTaskExecutor;
@@ -59,7 +60,7 @@ public class TaskExecutionAutoConfigurationTests {
AutoConfigurations.of(TaskExecutionAutoConfiguration.class));
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
@Test
public void taskExecutorBuilderShouldApplyCustomSettings() {

View File

@@ -37,7 +37,8 @@ import org.thymeleaf.templateresolver.ITemplateResolver;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.testsupport.BuildOutput;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@@ -60,7 +61,7 @@ import static org.assertj.core.api.Assertions.assertThat;
public class ThymeleafReactiveAutoConfigurationTests {
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private final BuildOutput buildOutput = new BuildOutput(getClass());

View File

@@ -32,7 +32,8 @@ import org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFact
import org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration;
import org.springframework.boot.test.context.assertj.AssertableReactiveWebApplicationContext;
import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
@@ -63,7 +64,7 @@ public class DefaultErrorWebExceptionHandlerIntegrationTests {
private final LogIdFilter logIdFilter = new LogIdFilter();
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
private ReactiveWebApplicationContextRunner contextRunner = new ReactiveWebApplicationContextRunner()
.withConfiguration(AutoConfigurations.of(

View File

@@ -22,7 +22,8 @@ import org.junit.jupiter.api.extension.RegisterExtension;
import org.springframework.boot.autoconfigure.AutoConfigurations;
import org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration;
import org.springframework.boot.test.context.runner.WebApplicationContextRunner;
import org.springframework.boot.test.extension.OutputCapture;
import org.springframework.boot.test.extension.CapturedOutput;
import org.springframework.boot.test.extension.OutputExtension;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.mock.web.MockHttpServletRequest;
import org.springframework.mock.web.MockHttpServletResponse;
@@ -45,7 +46,7 @@ public class ErrorMvcAutoConfigurationTests {
ErrorMvcAutoConfiguration.class));
@RegisterExtension
public OutputCapture output = new OutputCapture();
CapturedOutput output = OutputExtension.capture();
@Test
public void renderContainsViewWithExceptionDetails() throws Exception {