JUnit - 如何测试接受用户输入并相应地打印结果的主要方法?

JUnit - How to test the main method that takes a user input and prints a result accordingly?

我有一个接受输入并打印结果的计算器。例如: 输入扫描仪:

2+3+4=

打印:

9.00

我想在 JUnit 中测试这个主要方法。这是我到目前为止的进展(运算符是 class):

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.PrintStream;

import org.junit.Before;
import org.junit.jupiter.api.Test;

class MainTester {
    
    private final ByteArrayOutputStream resultByte = new ByteArrayOutputStream();
    private final PrintStream result = System.out;

    @Before
    public void setUp() {
        System.setOut(new PrintStream(resultByte));
    }
    
    @Test
    void test() {
        Operator operator = new Operator();
        
        String input = "2+3+4=";
        InputStream in = new ByteArrayInputStream(input.getBytes());
        System.setIn(in);
    
        String[] args = null;       
        System.out.println(operator.main(args));
        assertEquals("9.00", resultByte.toString());
    }
}

如果您分离职责,测试会容易得多。例如。计算结果的部分不应与读取输入和打印输出的部分相同。如果 Operator 有一个方法 compute,它接受一个带有输入(“2+3+4”)的字符串和 returns 一个带有结果(“9.00”)的字符串。然后你可以测试这个方法 returns 预期的结果。然后,您的 main 方法将读取输入并将其传递给 compute 并打印结果。

大致如下:

String result = operator.compute("2+3+4");
assertEquals(result, "9.00");