java - Java 控制台输入法的单元测试

标签 java unit-testing input console

如何对以下方法进行单元测试?

public static String grabString() {
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
do {
  try {
    // call the readline method of the buffered reader object.
    return r.readLine();
  } catch (Exception e) {
  }
} while (true);}

如果我像这样从测试类调用这个方法

String getInput = grabString();

并测试它

assertEquals(getInput, "hello");

是否可以使用代码在控制台中输入“hello”而不需要打字,以便单元测试立即运行?

最佳答案

我建议您不要使用静态方法,而是使用一个带有 InputStream 作为字段的对象(最终是单例)。 然后您可以在生产代码中使用真实的 System.in 并在测试中使用虚假的 InputStream。

类似这样的事情:

public class MyStreamReader {

    private InputStream in;

    public MyStreamReader(InputStream in) {
        this.in = in;
    }

    public String grabString() {
        BufferedReader r = new BufferedReader(new InputStreamReader(in));
        do {
            try {
                // call the readline method of the buffered reader object.
                return r.readLine();
            } catch (Exception e) {
            }
        } while (true);
    }

}

在生产代码中,您将使用 System.in 流构造实例(例如 new MyStreamReader(System.in))。

在测试中,您将使用假输入流进行测试:

@Test
public void testGrabString() throws Exception {
    String expected = "test input from console";
    ByteArrayInputStream fakeIS = new ByteArrayInputStream(expected.getBytes());
    MyStreamReader myStreamReader = new MyStreamReader(fakeIS);

    String actual = myStreamReader.grabString();
    assertEquals(expected, actual);
}

关于java - Java 控制台输入法的单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34577481/

相关文章:

java - 使用 poi 打印十进制值和电话号码

java - 如何将 Admob 与 Webview 集成

java - 使用Java从文件中读取数据

c - 在 C 中读取和写入字节(来自/在文件中)

选择文件后的 html 输入文件操作

java - spring中线程提交任务,不等待完成

java - java中免费电话号码的正则表达式

java - Spring Rest 文档不处理 html 标签

node.js - Mocha 茶覆盖范围未知

unit-testing - vstest.executionengine.exe 在 TFS 上崩溃,但在我的本地 VS2012 上一切正常