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:
@@ -0,0 +1,180 @@
|
||||
/*
|
||||
* Copyright 2012-2019 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.boot.test.extension;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.PrintStream;
|
||||
import java.util.NoSuchElementException;
|
||||
|
||||
import org.junit.jupiter.api.AfterEach;
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
||||
|
||||
/**
|
||||
* Tests for {@link CapturedOutput}.
|
||||
*
|
||||
* @author Phillip Webb
|
||||
*/
|
||||
class CapturedOutputTests {
|
||||
|
||||
private PrintStream originalOut;
|
||||
|
||||
private PrintStream originalErr;
|
||||
|
||||
private TestPrintStream systemOut;
|
||||
|
||||
private TestPrintStream systemErr;
|
||||
|
||||
private CapturedOutput output = new CapturedOutput();
|
||||
|
||||
@BeforeEach
|
||||
void replaceSystemStreams() {
|
||||
this.originalOut = System.out;
|
||||
this.originalErr = System.err;
|
||||
this.systemOut = new TestPrintStream();
|
||||
this.systemErr = new TestPrintStream();
|
||||
System.setOut(this.systemOut);
|
||||
System.setErr(this.systemErr);
|
||||
}
|
||||
|
||||
@AfterEach
|
||||
void restoreSystemStreams() {
|
||||
System.setOut(this.originalOut);
|
||||
System.setErr(this.originalErr);
|
||||
}
|
||||
|
||||
@Test
|
||||
void pushWhenEmptyStartsCapture() {
|
||||
System.out.print("A");
|
||||
this.output.push();
|
||||
System.out.print("B");
|
||||
assertThat(this.output).isEqualTo("B");
|
||||
}
|
||||
|
||||
@Test
|
||||
void pushWhenHasExistingStartesNewCapture() {
|
||||
System.out.print("A");
|
||||
this.output.push();
|
||||
System.out.print("B");
|
||||
this.output.push();
|
||||
System.out.print("C");
|
||||
assertThat(this.output).isEqualTo("BC");
|
||||
}
|
||||
|
||||
@Test
|
||||
void popWhenEmptyThrowsException() {
|
||||
assertThatExceptionOfType(NoSuchElementException.class)
|
||||
.isThrownBy(this.output::pop);
|
||||
}
|
||||
|
||||
@Test
|
||||
void popWhenHasExistingEndsCapture() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
this.output.pop();
|
||||
System.out.print("B");
|
||||
assertThat(this.systemOut.toString()).isEqualTo("AB");
|
||||
}
|
||||
|
||||
@Test
|
||||
void captureAlsoWritesToSystemOut() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
assertThat(this.systemOut.toString()).isEqualTo("A");
|
||||
}
|
||||
|
||||
@Test
|
||||
void captureAlsoWritesToSystemErr() {
|
||||
this.output.push();
|
||||
System.err.print("A");
|
||||
assertThat(this.systemErr.toString()).isEqualTo("A");
|
||||
}
|
||||
|
||||
@Test
|
||||
void lengthReturnsCapturedLength() {
|
||||
this.output.push();
|
||||
System.out.print("ABC");
|
||||
assertThat(this.output.length()).isEqualTo(3);
|
||||
}
|
||||
|
||||
@Test
|
||||
void charAtReturnsCapturedCharAt() {
|
||||
this.output.push();
|
||||
System.out.print("ABC");
|
||||
assertThat(this.output.charAt(1)).isEqualTo('B');
|
||||
}
|
||||
|
||||
@Test
|
||||
void subSequenceReturnsCapturedSubSequence() {
|
||||
this.output.push();
|
||||
System.out.print("ABC");
|
||||
assertThat(this.output.subSequence(1, 3)).isEqualTo("BC");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getAllReturnsAllCapturedOutput() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
System.err.print("B");
|
||||
System.out.print("C");
|
||||
assertThat(this.output.getAll()).isEqualTo("ABC");
|
||||
}
|
||||
|
||||
@Test
|
||||
void toStringReturnsAllCapturedOutput() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
System.err.print("B");
|
||||
System.out.print("C");
|
||||
assertThat(this.output.toString()).isEqualTo("ABC");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getErrReturnsOnlyCapturedErrOutput() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
System.err.print("B");
|
||||
System.out.print("C");
|
||||
assertThat(this.output.getErr()).isEqualTo("B");
|
||||
}
|
||||
|
||||
@Test
|
||||
void getOutReturnsOnlyCapturedOutOutput() {
|
||||
this.output.push();
|
||||
System.out.print("A");
|
||||
System.err.print("B");
|
||||
System.out.print("C");
|
||||
assertThat(this.output.getOut()).isEqualTo("AC");
|
||||
}
|
||||
|
||||
private static class TestPrintStream extends PrintStream {
|
||||
|
||||
TestPrintStream() {
|
||||
super(new ByteArrayOutputStream());
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.out.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -23,21 +23,21 @@ import org.junit.jupiter.api.extension.ExtensionContext;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link OutputCapture} when used via {@link ExtendWith @ExtendWith}.
|
||||
* Tests for {@link OutputExtension} when used via {@link ExtendWith @ExtendWith}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
@ExtendWith(OutputCapture.class)
|
||||
@ExtendWith(OutputCaptureExtendWithTests.BeforeAllExtension.class)
|
||||
class OutputCaptureExtendWithTests {
|
||||
@ExtendWith(OutputExtension.class)
|
||||
@ExtendWith(OutputExtensionExtendWithTests.BeforeAllExtension.class)
|
||||
class OutputExtensionExtendWithTests {
|
||||
|
||||
@Test
|
||||
void captureShouldReturnOutputCapturedBeforeTestMethod(OutputCapture output) {
|
||||
void captureShouldReturnOutputCapturedBeforeTestMethod(CapturedOutput output) {
|
||||
assertThat(output).contains("Before all").doesNotContain("Hello");
|
||||
}
|
||||
|
||||
@Test
|
||||
void captureShouldReturnAllCapturedOutput(OutputCapture output) {
|
||||
void captureShouldReturnAllCapturedOutput(CapturedOutput output) {
|
||||
System.out.println("Hello World");
|
||||
System.err.println("Error!!!");
|
||||
assertThat(output).contains("Before all").contains("Hello World")
|
||||
@@ -21,15 +21,15 @@ import org.junit.jupiter.api.extension.RegisterExtension;
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
/**
|
||||
* Tests for {@link OutputCapture} when used via
|
||||
* Tests for {@link OutputExtension} when used via
|
||||
* {@link RegisterExtension @RegisterExtension}.
|
||||
*
|
||||
* @author Madhura Bhave
|
||||
*/
|
||||
class OutputCaptureRegisterExtensionTests {
|
||||
class OutputExtensionRegisterExtensionTests {
|
||||
|
||||
@RegisterExtension
|
||||
OutputCapture output = new OutputCapture();
|
||||
CapturedOutput output = OutputExtension.capture();
|
||||
|
||||
@Test
|
||||
void captureShouldReturnAllCapturedOutput() {
|
||||
Reference in New Issue
Block a user