[λ²μ] Unit Testing of System.out.println() with JUnit
π‘ μλ³Έ κΈ : 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μμ νμΈν μ μμ΅λλ€.