๐ก ์๋ณธ ๊ธ : https://www.baeldung.com/java-testing-system-out-println
1. ์๊ฐ
๋จ์ ํ
์คํธ๋ฅผ ํ ๋ ๋๋๋ก System.out.println()
์ ํตํด ํ์ค ์ถ๋ ฅ๋ ๋ฉ์์ง๋ฅผ ํ
์คํธํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํ์ค ์ถ๋ ฅ๋ณด๋ค ๋ก๊น ํ๋ ์์ํฌ๋ฅผ ์ ํธํ์ง๋ง ๋๋๋ก ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ ์๋ ์์ต๋๋ค.
์ด ๋น ๋ฅธ ํํ ๋ฆฌ์ผ์์๋ JUnit์ ์ฌ์ฉํ์ฌ System.out.println()
์ ๋จ์ ํ
์คํธํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
2. ๊ฐ๋จํ print ๋ฉ์๋
์ด ํํ ๋ฆฌ์ผ์ ์งํํ๋ ๋์ ์์ฑํ๊ฒ ๋ ํ ์คํธ๋ ์ฃผ๋ก ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ ๊ฐ๋จํ ๋ฉ์๋๋ฅผ ๋์์ผ๋ก ์ผ์ ๊ฒ์ ๋๋ค:
private void print(String output) {
System.out.println(output);
}
System.out
๋ณ์๋ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ด๋ public static final PrintStream
๊ฐ์ฒด๋ก ์์คํ
์ ๋ฐ์์ ์ฌ์ฉ๋๋ค๋ ์ ์ ๋น ๋ฅด๊ฒ ์๊ธฐ์์ผ ๋๋ฆฝ๋๋ค.
์ถ๊ฐ์ ์ธ ๋ด์ฉ
ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ(standard output stream)์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์ฝ์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์คํธ๋ฆผ์ผ๋ก ์๋ฐ์์System.out
๋ณ์๊ฐ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ํ๋ ๋๋ค.
3. ํต์ฌ์ ์ธ Java ๋์
์ด์ ๋ถํฐ println ๋ฉ์๋๋ก ๋ณด๋ด๋ ๋ด์ฉ์ ํ์ธํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋, ์ค์ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ ์ ํ ์คํธ์์ ์ผ๋ถ ์ด๊ธฐํ ์ฝ๋๋ฅผ ์ ๊ณตํด์ฃผ์ด์ผ ํฉ๋๋ค.
private final PrintStream standardOut = System.out;
private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream();
@BeforeEach
public void setUp() {
System.setOut(new PrintStream(outputStreamCaptor));
}
setUp ๋ฉ์๋์์๋ ByteArrayOutputStream
์ ์ฌ์ฉํ์ฌ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ์๋ก์ด PrintStream
์ ์ฌํ ๋นํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ๋ณด๊ฒ ๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ด์ ๋ถํฐ ์ฌ๊ธฐ์ ์ถ๋ ฅ๋ ๊ฒ์
๋๋ค.
@Test
void givenSystemOutRedirection_whenInvokePrintln_thenOutputCaptorSuccess() {
print("Hello Baeldung Readers!!");
Assert.assertEquals("Hello Baeldung Readers!!", outputStreamCaptor.toString()
.trim());
}
์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ
์คํธ๋ฅผ print ๋ฉ์๋๋ก ํธ์ถํ ํ, ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ํ ์ฝํ
์ธ ๊ฐ outputStreamCaptor
์ ํฌํจ๋์ด ์๋์ง ํ์ธํด๋ณผ ์ ์์ต๋๋ค. System.out.println()
์ด ์ถ๊ฐํ ์ ์ค์ ์ ๊ฑฐํ๊ธฐ ์ํด trim()
๋ฅผ ํธ์ถํฉ๋๋ค.
ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ ๊ณต์ ์ ์ ๋ฆฌ์์ค์ด๋ฏ๋ก ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด ์๋ ์ํ๋ก ๋ณต์ํด์ผ ํฉ๋๋ค.
@AfterEach
public void tearDown() {
System.setOut(standardOut);
}
์ด๋ ๊ฒ ํ๋ฉด ๋์ค์ ๋ค๋ฅธ ํ ์คํธ์์ ์์น ์๋ ๋ถ์์ฉ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
System.setOut์ด๋?
ํด๋น ๋ฉ์๋๋ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ ์ ์ ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
public static void setOut(PrintStream out)
๋ค๋ฅธ ๋ถ๋ถ์์ ์ฌ์ฉ๋๋ ๊ณต์ ์ ์ ๋ฆฌ์์ค๋ก์จ ํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด ์๋ ์ํ๋ก ๋ณต์ํด์ผ ํฉ๋๋ค.
ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ฌ์ ์๋ฅผ ํ๋ฉด System.out๋ก ์ถ๋ ฅํ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
4. ์์คํ ๊ท์น ์ฌ์ฉ
System ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ํ ์คํธ ํ๊ธฐ ์ํ Junit ๊ท์น์ ์ ๊ณตํด์ฃผ๋ System Rules๋ผ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
pom.xml์ ์๋์ ๊ฐ์ด ์์กด์ฑ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-rules</artifactId>
<version>1.19.0</version>
<scope>test</scope>
</dependency>
gradle์์๋ ์๋์ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
implementation("com.github.stefanbirkner:system-rules:1.19.0")
์ด์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ SystemOutRule ์ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
@Rule
public final SystemOutRule systemOutRule = new SystemOutRule().enableLog();
@Test
public void givenSystemOutRule_whenInvokePrintln_thenLogSuccess() {
print("Hello Baeldung Readers!!");
Assert.assertEquals("Hello Baeldung Readers!!", systemOutRule.getLog()
.trim());
}
์ ๋ง ๋ฉ์ง๋๋ค! SystemOutRule
์ ์ฌ์ฉํ๋ฉด System.out
์ ๋ํ ์ฐ๊ธฐ๋ฅผ ์ฐจ๋จํ ์ ์์ต๋๋ค.
๋จผ์ ๊ท์น์์ enableLog()
๋ฅผ ํธ์ถํ์ฌ System.out
์ ๊ธฐ๋ก๋ ๋ชจ๋ ๋ด์ฉ์ ๊ธฐ๋กํ๊ธฐ ์์ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์ enableLog()
๋ฅผ ํธ์ถํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋จํ getLog()
๋ฅผ ํธ์ถํ์ฌ System.out
์ ๊ธฐ๋ก๋ ํ
์คํธ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
์ด ๊ท์น์๋ ํญ์ ์ค ๊ตฌ๋ถ ๊ธฐํธ๊ฐ \\\\n
์ธ ๋ก๊ทธ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ ํฌํจ๋์ด ์์ต๋๋ค.
Assert.assertEquals("Hello Baeldung Readers!!\\n", systemOutRule.getLogWithNormalizedLineSeparator());
5. Junit5 ๋ฐ Lambda์ ํจ๊ป ์์คํ ๊ท์น ์ฌ์ฉ
Junit5์์๋ ๊ท์น ๋ชจ๋ธ์ด extensions๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค. ๋คํํ, 4๋ฒ ์ธ์ ์์ ์ ์๋ ์์คํ ๊ท์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ Junit5์ ํจ๊ป ๋์ํ๋๋ก ์ค๋น๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์์ต๋๋ค.
System Lambda๋ Maven Central์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ pom.xml์ ์ถ๊ฐํ ์ ์์ต๋๋ค:
<dependency>
<groupId>com.github.stefanbirkner</groupId>
<artifactId>system-lambda</artifactId>
<version>1.2.1</version>
</dependency>
gradle์์๋ ์๋์ ๊ฐ์ด ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
implementation("com.github.stefanbirkner:system-lambda:1.2.1")
์ด์ ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค:
@Test
void givenTapSystemOut_whenInvokePrintln_thenOutputIsReturnedSuccessfully() throws Exception {
String text = tapSystemOut(() -> {
print("Hello Baeldung Readers!!");
});
Assert.assertEquals("Hello Baeldung Readers!!", text.trim());
}
์ด ๋ฒ์ ์์๋ ๋ช ๋ น๋ฌธ์ ์คํํ๊ณ System.out์ ์ ๋ฌ๋ ์ฝํ ์ธ ๋ฅผ ์บก์ฒํ ์ ์๋ tapSystemOut ๋ฉ์๋๋ฅผ ์ฌ์ฉํฉ๋๋ค.
6. ๊ฒฐ๋ก
์ด ํํ ๋ฆฌ์ผ์์๋ System.out.println๋ฅผ ํ ์คํธํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ ๋ํด ๋ฐฐ์ ์ต๋๋ค. ์ฒซ ๋ฒ์งธ ์ ๊ทผ ๋ฐฉ์์์๋ ๊ธฐ๋ณธ์ ์ธ Java๋ฅผ ์ฌ์ฉํ์ฌ ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผ์ ์์ฑํ๋ ์์น๋ฅผ ๋ฆฌ๋๋ ์ ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์์ต๋๋ค.
๊ทธ๋ฐ ๋ค์์ Junit4 ์คํ์ผ ๊ท์น์ ์ฌ์ฉํ๊ณ ๋์ค์ ๋๋ค๋ก ์์ ํ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๋ฐฐ์ ์ต๋๋ค.
์ธ์ ๋ ๊ทธ๋ ๋ฏ์ด ๊ธฐ์ฌ์ ์ ์ฒด ์์ค ์ฝ๋๋ Github์์ ํ์ธํ ์ ์์ต๋๋ค.