使用 JUnit 测试 println 输出

Testing println output with JUnit

我正在测试一个简单的 helloWorld class。

package Codewars;

public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }

}

我有一个测试 class 如下(基于 answer ):

import static org.junit.jupiter.api.Assertions.*;

import java.io.ByteArrayOutputStream;
import java.io.PrintStream;

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

class helloWorldTest {

    private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
    private final PrintStream originalOut = System.out;

    @BeforeEach
    public void setUpStreams() {
        System.setOut(new PrintStream(outContent));
    }

    @AfterEach
    public void restoreStreams() {
        System.setOut(originalOut);
    }

    @Test
    void test() {
        HelloWorld.main(null);
        assertEquals("Hello World\n", outContent.toString());
    }

}

它导致失败并显示如下错误消息:

org.opentest4j.AssertionFailedError: expected: <Hello World
> but was: <Hello World
>
    at org.junit.jupiter.api@5.5.1/org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
    at org.junit.jupiter.api@5.5.1/org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)
    ...

好像字符串是一样的,还是报错?

提前致谢。

确保您的行分隔符等于您系统上的 \n。 Windows.

不是这种情况

要修复测试,修改它以考虑系统特定​​的分隔符

assertEquals("Hello World" + System.lineSeparator(), outContent.toString());