diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/CapturedOutput.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/CapturedOutput.java index 22561e71d7f..fa7e2653712 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/CapturedOutput.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/CapturedOutput.java @@ -23,7 +23,7 @@ package org.springframework.boot.test.system; * standard JUnit assertions. For example:
* assertThat(output).contains("started"); // Checks all output
* assertThat(output.getErr()).contains("failed"); // Only checks System.err
- * assertThat(output.getOut()).contains("ok"); // Only checks System.put
+ * assertThat(output.getOut()).contains("ok"); // Only checks System.out
*
*
* @author Madhura Bhave
diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/OutputCapture.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/OutputCapture.java
index 5fc6fd6ac4e..0261d9d3feb 100644
--- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/OutputCapture.java
+++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/system/OutputCapture.java
@@ -38,6 +38,8 @@ import org.springframework.util.ClassUtils;
* @author Madhura Bhave
* @author Phillip Webb
* @author Andy Wilkinson
+ * @author Sam Brannen
+ * @since 2.2.0
* @see OutputCaptureExtension
* @see OutputCaptureRule
*/
@@ -125,7 +127,12 @@ class OutputCapture implements CapturedOutput {
}
private String get(Predicate- * To use, add {@link ExtendWith @ExtendWith} and inject the {@link CapturedOutput} as an - * argument to your test class constructor or test method: + * To use with {@link ExtendWith @ExtendWith}, inject the {@link CapturedOutput} as an + * argument to your test class constructor, test method, or lifecycle methods: * *
* @ExtendWith(OutputCaptureExtension.class)
@@ -42,7 +44,15 @@ import org.junit.jupiter.api.extension.ParameterResolver;
*
* @Test
* void test(CapturedOutput output) {
+ * System.out.println("ok");
* assertThat(output).contains("ok");
+ * System.err.println("error");
+ * }
+ *
+ * @AfterEach
+ * void after(CapturedOutput output) {
+ * assertThat(output.getOut()).contains("ok");
+ * assertThat(output.getErr()).contains("error");
* }
*
* }
@@ -51,36 +61,35 @@ import org.junit.jupiter.api.extension.ParameterResolver;
* @author Madhura Bhave
* @author Phillip Webb
* @author Andy Wilkinson
+ * @author Sam Brannen
* @since 2.2.0
* @see CapturedOutput
*/
public class OutputCaptureExtension
implements BeforeAllCallback, AfterAllCallback, BeforeEachCallback, AfterEachCallback, ParameterResolver {
- private final OutputCapture outputCapture = new OutputCapture();
-
OutputCaptureExtension() {
// Package private to prevent users from directly creating an instance.
}
@Override
public void beforeAll(ExtensionContext context) throws Exception {
- this.outputCapture.push();
+ getOutputCapture(context).push();
}
@Override
public void afterAll(ExtensionContext context) throws Exception {
- this.outputCapture.pop();
+ getOutputCapture(context).pop();
}
@Override
public void beforeEach(ExtensionContext context) throws Exception {
- this.outputCapture.push();
+ getOutputCapture(context).push();
}
@Override
public void afterEach(ExtensionContext context) throws Exception {
- this.outputCapture.pop();
+ getOutputCapture(context).pop();
}
@Override
@@ -90,9 +99,16 @@ public class OutputCaptureExtension
}
@Override
- public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext)
- throws ParameterResolutionException {
- return this.outputCapture;
+ public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
+ return getOutputCapture(extensionContext);
+ }
+
+ private OutputCapture getOutputCapture(ExtensionContext context) {
+ return getStore(context).getOrComputeIfAbsent(OutputCapture.class);
+ }
+
+ private Store getStore(ExtensionContext context) {
+ return context.getStore(Namespace.create(getClass()));
}
}