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

@@ -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();
}
}
}

View File

@@ -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")

View File

@@ -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() {